1

我需要您的帮助来解决我在进行大型更新时遇到的问题。嗨,我们想为开发人员/测试人员创建一个服务器,并且我们希望从生产中获得一个副本,所以我们想用我执行更新时生成的随机 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,更新也永远不会完成,所以你能帮我创建一个查询来帮助我完成这个过程吗?

4

1 回答 1

0

首先,在 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

或者,您可以在数据库上创建一个视图,获取您想要的生产数据,同时隐藏您不希望开发人员看到的字段。然后可以使用此视图选择到DevelopmentDB,或使用bcp导出/导入

create view DEV_VIEW (NAME, LAST_NAME, NSS, colA, colB) as
select "John", "Doe", RandomNSS, other_colA, other_colB
from CUSTOMERS
于 2013-03-28T02:09:28.537 回答