我需要你的帮助来解决一个问题,我有一个大的更新。嗨,我们想为开发人员/测试人员创建一个服务器,我们想要从生产中获得一个副本,所以我们想要混淆NSS在我执行更新时生成的随机NSS,所以我创建了一个函数来执行这个过程。这是更新:
UPDATE CUSTOMERS SET
NAME = 'John',
LAST NAME ='Doe',
NSS = RandomNSS
plan '(i_scan PK_CUSTOMERS CUSTOMERS)'
更新工作得很好,除了表有900万长,所以我得到了日志挂起或消息,你没有锁,所以进程永远不会结束,所以我试图实现以下内容:
SET ROWCOUNT 10000
WHILE (1 = 1)
BEGIN
BEGIN TRANSACTION
UPDATE CUSTOMERS SET
NAME = 'John',
LAST NAME ='Doe',
NSS = RandomNSS
plan '(i_scan PK_CUSTOMERS CUSTOMERS)'
IF @@ROWCOUNT = 0
BEGIN
COMMIT TRANSACTION
BREAK
END
COMMIT TRANSACTION
END
SET ROWCOUNT 0
但是这并不能解决问题,因为我没有where子句,所以即使所有客户的名字都是John Doe,更新也不会完成,所以你能帮我创建一个查询来帮助我完成这个过程吗?
首先,在DEV系统上,我将更改数据库的设置,以便它在检查点时截断事务日志。这将防止日志在您完成更新时被填满。因为DEV数据库是从PROD数据库恢复的,所以为了可恢复性而转储事务日志并不重要。
sp_dboption DEV_DB, 'trunc log on chkpt', true
如果必须进行更新,请尝试更改while循环,直到所有名称都更改为"John",如下所示。
SET ROWCOUNT 10000
while ( select count(*) from CUSTOMERS where name != "John" and LAST_NAME != 'Doe' ) > 0
BEGIN
BEGIN TRANSACTION
UPDATE CUSTOMERS SET
NAME = 'John',
LAST NAME ='Doe',
NSS = RandomNSS
WHERE name != "John" AND LAST_NAME != "DOE"
plan '(i_scan PK_CUSTOMERS CUSTOMERS)'
COMMIT TRANSACTION
END
SET ROWCOUNT 0
或者,您可以在数据库上创建一个视图,抓取您想要的生产数据,同时模糊您不想让开发人员看到的字段。然后可以使用该视图选择到中的DevelopementDB,或者使用bcp
导出/导入。create view DEV_VIEW (NAME, LAST_NAME, NSS, colA, colB) as
select "John", "Doe", RandomNSS, other_colA, other_colB
from CUSTOMERS