Sybase的大更新



我需要你的帮助来解决一个问题,我有一个大的更新。嗨,我们想为开发人员/测试人员创建一个服务器,我们想要从生产中获得一个副本,所以我们想要混淆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

相关内容

  • 没有找到相关文章

最新更新