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 に答える