3

私の SQL データベース プロジェクトには、データベースの一部である必要がある既定値を登録する配置後スクリプトがあります。結果を変更せずにこのスクリプトを複数回実行できるようにしたいので、少し変更を加える必要がある場合は手動で実行できます。

INSERT INTO [UserRole] ([Name])
SELECT 'Regular'
UNION ALL
SELECT 'Admin'

INSERT INTO [UserRight] ([Name])
SELECT 'CanAccessApplicationLogs'
UNION ALL
SELECT 'CanAccessApplicationJobs'

INSERT INTO [UserRoleRight] ([UserRoleId], [UserRightId])
SELECT  [Ro].[Id], [Ri].[Id] FROM [UserRight] Ri, [UserRole] Ro
 WHERE ([Ro].[Name] = 'Admin' AND
        [Ri].[Name] = 'CanAccessApplicationLogs')
    OR ([Ro].[Name] = 'Admin' AND
        [Ri].[Name] = 'CanAccessApplicationJobs')

このスクリプトはロールと権限を挿入するだけなので、パフォーマンスが問題になるとは思えません。では、各行が存在するかどうかを確認し、まだテーブルにない行のみを挿入する最もクリーンな方法は何でしょうか?

4

2 に答える 2

6

各挿入を IF ステートメントでラップするとうまくいきます。ただし、それが最もクリーンな方法かどうかはわかりません。

したがって、最初の INSERT は次のようになります。

IF NOT EXISTS(SELECT * FROM UserRole WHERE Name = 'Regular')
BEGIN
  INSERT INTO [UserRole] ([Name])
  SELECT 'Regular'
  UNION ALL
  SELECT 'Admin'
END
于 2012-08-12T02:19:57.870 に答える
4

MERGE はよりクリーンになり、すべての行の周りに IF ステートメントを必要とせずに、各行を個別にチェックします。

http://coding.abel.nu/2012/08/idempotent-db-update-scripts/に良い例があります

于 2013-02-20T13:50:22.700 に答える