0

我被要求编辑内容的网站有几百个基于模板的现有页面(博客文章)。我已经调整了模板内容中的电子邮件地址,因此所有新文章都将具有正确的地址,但我想替换现有页面上的旧地址。

该网站是基于 SQL Server 数据库构建的 .aspx。

我可以访问数据库,但不知道哪些表(更不用说列或单元格)包含特定的电子邮件地址。

我想首先在数据库中搜索以在文本/内容中找到此电子邮件地址的所有外观,然后,如果没有任何会产生不利影响的外观,我想做一个查找/replace 将其更新为新地址。

我不熟悉 SQL Server。我该怎么做呢?

仅供参考...网站上的代码(它是评论表单的一部分)将始终是:

<input type="hidden" value="user@emaildomain.com.au" name="Notify" />

编辑:
我根本不知道 html 字符串在数据库中的位置,但我做了一些搜索,发现我需要更改电子邮件地址的页面都是由一个表和列定义的。

DB = CMSDB
Table = dbo.tblContent
Column = ContentText

我正在使用 Microsoft SQL Server Management Studio Express 查看数据库

4

2 回答 2

2

UPDATE这将为数据库中所有用户表中的每个基于字符的列生成单独的语句。您可能可以将其增强为嵌套,这样您就可以省略任何UPDATE行中不包含旧电子邮件地址的列的任何语句,但作为一次性任务,增加的复杂性不太可能得到回报。

DECLARE 
  @oldEmailAddress VARCHAR(320) = 'oldaddress@foo.com', 
  @newEmailAddress VARCHAR(320) = 'newaddress@bar.com';

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT TOP (5) @sql += N'
PRINT N''Updating ' + QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))
  + '.' + QUOTENAME(OBJECT_NAME([object_id]))
  + '.' + QUOTENAME(name) + '...'';
UPDATE ' 
  + QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))
  + '.' + QUOTENAME(OBJECT_NAME([object_id]))
  + ' SET ' + QUOTENAME(name) + ' = REPLACE('
  + QUOTENAME(name) + ', @old, @new)
    WHERE ' + QUOTENAME(name) + ' LIKE ''%'' + @old + ''%'';'
FROM sys.columns AS c
WHERE system_type_id IN (35,99,167,175,231,239)
AND EXISTS (SELECT 1 FROM sys.tables WHERE [object_id] = c.[object_id]);

PRINT @sql;
/*
 EXEC sp_executesql 
   @sql, 
   N'@old VARCHAR(320), @new VARCHAR(320)',
   @oldEmailAddress, @newEmailAddress;
*/

您确实应该考虑在此处放置某种令牌,并让网页将令牌替换为您存储在单个配置文件或表中的电子邮件地址。你知道,而不是仅仅用另一个电子邮件地址的几十个实例替换必须更改的数十个实例,而另一个电子邮件地址可能在未来某个时间必须更改(此时您将争先恐后地找到这篇文章,这样你就可以重复这个过程)。

如果内容仅在一张表的一列中,您的任务会容易得多。但是,您应该更新您的问题以反映这一点,因为目前听起来它将在多个列/表中:

但不知道哪些表格(更不用说列或单元格)包含特定的电子邮件地址。

现在你说:

DB = CMSDB,表 = dbo.tblContent,列 = ContentText

因此,要求令人困惑。如果邮箱地址真的只能出现在上一栏,那么如下:

USE CMSDB;
GO

DECLARE 
  @oldEmailAddress VARCHAR(320) = 'oldaddress@foo.com', 
  @newEmailAddress VARCHAR(320) = 'newaddress@bar.com';

UPDATE dbo.tblContent
  SET ContentText 
      = REPLACE(ContentText, @OldEmailAddress, @NewEmailAddress)
  WHERE ContentText LIKE '%' + @OldEmailAddress + '%';
于 2013-07-31T00:44:25.957 回答
0

您可以将所有表导出为UPDATE语句,并且可以使用 linux 实用程序调用sed来更新行。

你需要这样的东西:

sed -i 's/old_email/new_email/g' sql.file
于 2013-07-31T00:27:14.343 回答