Lee Crowe
Nov 19, 2014
  4100
(0 votes)

Content search and replace

The development team I currently work in like to have content in line with production content but it very quickly becomes outdated.


To aid with this we have Go pipelines which restore production database backups over lower internal environment databases.


The CMS Site has many links to various other product journeys. These journeys have environment specific Urls. If we are are in our regression environment, we would like content links to hand off to the relevant regression product journeys.


Our go pipeline restores the production database and performs many content replacements by executing a search and replace stored procedure. Below you will find the stored procedure definition to search and replace content.


IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_CustomSearchAndReplace]') AND type in (N'P', N'PC'))
      DROP PROCEDURE [dbo].[usp_CustomSearchAndReplace]
GO

CREATE PROCEDURE [dbo].[usp_CustomSearchAndReplace]
      @SearchFor nvarchar(1000),
      @ReplaceWith nvarchar(1000) = ''
AS
      SELECT * FROM [tblContentProperty] WHERE [String] LIKE '%' + @SearchFor + '%' OR [LongString] LIKE '%' + @SearchFor + '%'
      SELECT * FROM [tblWorkContentProperty] WHERE [String] LIKE '%' + @SearchFor + '%' OR [LongString] LIKE '%' + @SearchFor + '%'

      IF LEN(LTRIM(RTRIM(@ReplaceWith))) > 0
      BEGIN
            PRINT 'Updating published pages'
            UPDATE [tblContentProperty] SET [String] = REPLACE([String], @SearchFor, @ReplaceWith) WHERE [String] LIKE '%' + @SearchFor + '%'
            UPDATE [tblContentProperty] SET [LongString] = REPLACE(CAST([LongString] AS nvarchar(max)), @SearchFor, @ReplaceWith) WHERE [LongString] LIKE '%' + @SearchFor + '%'
            PRINT 'Updating unpublished pages'
            UPDATE [tblWorkContentProperty] SET [String] = REPLACE([String], @SearchFor, @ReplaceWith) WHERE [String] LIKE '%' + @SearchFor + '%'
            UPDATE [tblWorkContentProperty] SET [LongString] = REPLACE(CAST([LongString] AS nvarchar(max)), @SearchFor, @ReplaceWith) WHERE [LongString] LIKE '%' + @SearchFor + '%'
            PRINT 'Updating soft links'
            UPDATE [tblContentSoftlink] SET [LinkURL] = REPLACE([LinkURL], @SearchFor, @ReplaceWith) WHERE [LinkURL] LIKE '%' + @SearchFor + '%'
      END
Nov 19, 2014

Comments

Nov 19, 2014 02:27 PM

The TSQL above is for EPiServer v7.

For EPiSever v6 the following replacements will need to be made:
- Replace [tblContentProperty] with [tblProperty]
- Replace [tblWorkContentProperty] with [tblWorkProperty]
- Replace [tblContentSoftlink] with [tblPageSoftlink]

Henrik Fransas
Henrik Fransas Nov 19, 2014 03:58 PM

Do not forget that you have to make EPiServer to recycle the cache (IIS reset is the best way)

Nov 19, 2014 04:20 PM

Indeed, our Go pipelines recycle the application pools once content has been refreshed.

Nov 20, 2014 03:17 PM

Nice work Croweman. as ever I'd approach this in a slighlty different way using my favourite tool IIS UrlRewrite:)

Rather than modifying the datbase. I've approached this by adding some outbound rewrite rules. These scan any outbound html from the server and replace all instances of the live url with the test site url (or other environment). The advantage of this per environment configuration approach, is no changes to data. and you can be very sure that no urls matching that pattern willl ever appear, regardless of how they are entered in the website.

Obviously scanning outbound html incurs a small performance hit, but on a test environment this shouldn't be an issue.

I've put a gist together of the type of configuration needed.

https://gist.github.com/markeverard/8aa02cf0539d12cbefd7

Nov 20, 2014 05:37 PM

Very nice Doctor ;)

I didn't realise you could modify outgoing html using the rewrite module :)

Please login to comment.
Latest blogs
Opti ID with Secure Cookies And Third Party AddOns

Opti ID has revolutionised access to the Optimizely One suite and is now the preferred authentication method on all PAAS CMS websites that I build....

Mark Stott | Dec 9, 2024

AsyncHelper can be considered harmful

.NET developers have been in the transition to move from synchronous APIs to asynchronous API. That was boosted a lot by await/async keyword of C#...

Quan Mai | Dec 4, 2024 | Syndicated blog

The search for dictionary key

Recently I helped to chase down a ghost (and you might be surprised to know that I, for most part, spend hours to be a ghostbuster, it could be fun...

Quan Mai | Dec 4, 2024 | Syndicated blog

Shared optimizely cart between non-optimizley front end site

E-commerce ecosystems often demand a seamless shopping experience where users can shop across multiple sites using a single cart. Sharing a cart...

PuneetGarg | Dec 3, 2024

CMS Core 12.22.0 delisted from Nuget feed

We have decided to delist version 12.22.0 of the CMS Core packages from our Nuget feed, following the discovery of a bug that affects rendering of...

Magnus Rahl | Dec 3, 2024

Force Login to Optimizely DXP Environments using an Authorization Filter

When working with sites deployed to the Optimizely DXP, you may want to restrict access to the site in a particular environment to only authenticat...

Chris Sharp | Dec 2, 2024 | Syndicated blog