SQL Server 數據庫初始化准備腳本


通常我們在項目部署前都會寫一份數據庫初始化腳本。由於數據庫外鍵的限制,我們需要按照數據引用順序添加初始記錄,這個整理過程相當麻煩。

因此寫了以下腳本,原理是先去掉所有外鍵,然后執行一次清空,然后添加數據,最后恢復外鍵。

網上也有暫時禁用外鍵添加數據的方法,但由於SQL Server在有外鍵的情況下,不能使用TRUNCATE TABLE語句,因此暫時禁用外鍵時,只能使用DELETE語句清除無用數據。如果覺得刪除外鍵不安全,也可以考慮將以下腳本修改為禁用外鍵的方式運行。

腳本在 SQL Server 2005、SQL Server 2008 R2、SQL Server 2012 上測試過,都沒有問題。

 1 SET NOCOUNT ON;
 2 
 3 DECLARE @script NVARCHAR(255);
 4 
 5 --緩存所有外鍵
 6 SELECT OBJECT_NAME(fk.constraint_object_id) AS name, OBJECT_NAME(fk.parent_object_id) AS ptab, pc.name AS pcol, OBJECT_NAME(fk.referenced_object_id) AS rtab, rc.name AS rcol
 7 INTO #FK_ON
 8 FROM sys.foreign_key_columns fk
 9 LEFT JOIN sys.columns pc ON fk.parent_column_id = pc.column_id AND fk.parent_object_id = pc.[object_id]
10 LEFT JOIN sys.columns rc ON fk.referenced_column_id = rc.column_id AND fk.referenced_object_id = rc.[object_id];
11 
12 BEGIN TRAN
13 
14 --刪除所有外鍵
15 DECLARE cur_fk_off CURSOR FOR SELECT 'ALTER TABLE [dbo].[' + OBJECT_NAME(parent_object_id) + '] DROP CONSTRAINT ' + name FROM sys.foreign_keys;
16 OPEN cur_fk_off
17 FETCH NEXT FROM cur_fk_off INTO @script
18 WHILE @@FETCH_STATUS = 0
19 BEGIN
20     EXEC(@script)
21     FETCH NEXT FROM cur_fk_off INTO @script
22 END
23 CLOSE cur_fk_off
24 DEALLOCATE cur_fk_off
25 
26 --清空所有表
27 DECLARE cur_tabs CURSOR FOR SELECT 'TRUNCATE TABLE [dbo].[' + name + ']' FROM sys.tables;
28 OPEN cur_tabs
29 FETCH NEXT FROM cur_tabs INTO @script
30 WHILE @@FETCH_STATUS = 0
31 BEGIN
32     EXEC(@script)
33     FETCH NEXT FROM cur_tabs INTO @script
34 END
35 CLOSE cur_tabs
36 DEALLOCATE cur_tabs
37 
38 --寫入初始化數據
39 --INSERT INTO ...
40 
41 --重建所有外鍵
42 DECLARE cur_fk_on CURSOR FOR SELECT 'ALTER TABLE [dbo].[' + ptab + '] ADD CONSTRAINT ' + name + ' FOREIGN KEY ([' + pcol + ']) REFERENCES [dbo].[' + rtab + '] ([' + rcol + '])' FROM #FK_ON;
43 OPEN cur_fk_on
44 FETCH NEXT FROM cur_fk_on INTO @script
45 WHILE @@FETCH_STATUS = 0
46 BEGIN
47     EXEC(@script)
48     FETCH NEXT FROM cur_fk_on INTO @script
49 END
50 CLOSE cur_fk_on
51 DEALLOCATE cur_fk_on
52 
53 --清除緩存
54 DROP TABLE #FK_ON
55 
56 COMMIT TRAN
57 GO

本文出自於 飛揚的塵埃的博客 轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM