2012-08-12 203 views
2

我在我的SQL數據庫項目中有一個後期部署腳本,它註冊了應該是數據庫一部分的默認值。我希望這個腳本能夠在不改變結果的情況下多次運行,所以如果我需要添加一點修改,我可以手動運行它。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') 

我懷疑績效永遠不會是問題,因爲這個腳本只是插入角色和權利。那麼最乾淨的方法是檢查每行是否存在,並只插入那些不在表中的那些?

回答

3

將每個插入包裝在IF語句中都可以工作。不知道它是否是最乾淨的方式。

所以,你的第一個INSERT將成爲:

IF NOT EXISTS(SELECT * FROM UserRole WHERE Name = 'Regular') 
BEGIN 
    INSERT INTO [UserRole] ([Name]) 
    SELECT 'Regular' 
    UNION ALL 
    SELECT 'Admin' 
END 
3

一個MERGE可以有很多更清潔,將分別檢查每一行,而不IF語句需要每個人身邊。

http://coding.abel.nu/2012/08/idempotent-db-update-scripts/有一個很好的例子

+0

這很酷!看起來它甚至可以容納你刪除的條目。我的MySQL有點生疏,所以我需要弄清楚如何概括這個。 – sdanzig 2014-12-07 16:02:07

+0

等一下,不,這不是MySQL。重複密鑰我認爲是要走的路。沒有適應我刪除的條目我想。 – sdanzig 2014-12-07 16:20:36