通常我们在项目部署前都会写一份数据库初始化脚本。由于数据库外键的限制,我们需要按照数据引用顺序添加初始记录,这个整理过程相当麻烦。

因此写了以下脚本,原理是先去掉所有外键,然后执行一次清空,然后添加数据,最后恢复外键。

网上也有暂时禁用外键添加数据的方法,但由于SQL Server在有外键的情况下,不能使用TRUNCATE TABLE语句,因此暂时禁用外键时,只能使用DELETE语句清除无用数据。如果觉得删除外键不安全,也可以考虑将以下脚本修改为禁用外键的方式运行。

脚本在 SQL Server 2005、SQL Server 2008 R2、SQL Server 2012 上测试过,都没有问题。

 SET NOCOUNT ON;

 DECLARE @script NVARCHAR(255);

 --缓存所有外键
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
INTO #FK_ON
FROM sys.foreign_key_columns fk
LEFT JOIN sys.columns pc ON fk.parent_column_id = pc.column_id AND fk.parent_object_id = pc.[object_id]
LEFT JOIN sys.columns rc ON fk.referenced_column_id = rc.column_id AND fk.referenced_object_id = rc.[object_id]; BEGIN TRAN --删除所有外键
DECLARE cur_fk_off CURSOR FOR SELECT 'ALTER TABLE [dbo].[' + OBJECT_NAME(parent_object_id) + '] DROP CONSTRAINT ' + name FROM sys.foreign_keys;
OPEN cur_fk_off
FETCH NEXT FROM cur_fk_off INTO @script
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC(@script)
FETCH NEXT FROM cur_fk_off INTO @script
END
CLOSE cur_fk_off
DEALLOCATE cur_fk_off --清空所有表
DECLARE cur_tabs CURSOR FOR SELECT 'TRUNCATE TABLE [dbo].[' + name + ']' FROM sys.tables;
OPEN cur_tabs
FETCH NEXT FROM cur_tabs INTO @script
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC(@script)
FETCH NEXT FROM cur_tabs INTO @script
END
CLOSE cur_tabs
DEALLOCATE cur_tabs --写入初始化数据
--INSERT INTO ... --重建所有外键
DECLARE cur_fk_on CURSOR FOR SELECT 'ALTER TABLE [dbo].[' + ptab + '] ADD CONSTRAINT ' + name + ' FOREIGN KEY ([' + pcol + ']) REFERENCES [dbo].[' + rtab + '] ([' + rcol + '])' FROM #FK_ON;
OPEN cur_fk_on
FETCH NEXT FROM cur_fk_on INTO @script
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC(@script)
FETCH NEXT FROM cur_fk_on INTO @script
END
CLOSE cur_fk_on
DEALLOCATE cur_fk_on --清除缓存
DROP TABLE #FK_ON COMMIT TRAN
GO

本文出自于 飞扬的尘埃的博客 转载请注明出处。

SQL Server 数据库初始化准备脚本的更多相关文章

  1. Sql Server数据库常用Transact-SQL脚本

    数据库 1.创建数据库 USE master ; GO CREATE DATABASE Sales ON ( NAME = Sales_dat, FILENAME = 'C:\Program File ...

  2. SQL Server数据库的基础脚本编程

    数据库脚本的基础编程 Go批量处理语句 用于同时处理多条语句 use指定数据库或表 use master --创建数据库 go use Student --创建表(Student)表示数据库 go 创 ...

  3. 从SQL Server数据库转到Oracle数据库的数据脚本处理

    在我们很多情况下的开发,为了方便或者通用性的考虑,都首先考虑SQL Server数据库进行开发,但有时候客户的生产环境是Oracle或者其他数据库,那么我们就需要把对应的数据结构和数据脚本转换为对应的 ...

  4. sql server数据库备份单个表的结构和数据生成脚本

    1.使用场景:sql server数据库备份单个表的结构和数据,在我们要修改正式系统的数据的一天或者多条某些数据时候,要执行update语句操作,安全稳健考虑,最好先做好所修改的表的结构和数据备份! ...

  5. sql server数据库备份单个表的结构和数据生成脚本【转】

    1.使用场景:sql server数据库备份单个表的结构和数据,在我们要修改正式系统的数据的一天或者多条某些数据时候,要执行update语句操作,安全稳健考虑,最好先做好所修改的表的结构和数据备份! ...

  6. 5、SQL Server数据库、T-SQL

    SQL Server数据库基础 一.安装SQL Server数据库 setup.exe->安装->全新SQL Server独立安装或向现有安装添加功能->输入序列号->下一步- ...

  7. Microsoft SQL Server 数据库 错误号大全

    panchzh :Microsoft SQL Server 数据库 错误号大全0 操作成功完成. 1 功能错误. 2 系统找不到指定的文件. 3 系统找不到指定的路径. 4 系统无法打开文件. 5 拒 ...

  8. 在打包程序中自动安装SQL Server数据库 .

    原文:在打包程序中自动安装SQL Server数据库 . 1.创建安装项目“Setup1”安装项目 在“文件”菜单上指向“添加项目”,然后选择“新建项目”. 在“添加新项目”对话框中,选择“项目类型” ...

  9. TransactionScope事务处理方法介绍及.NET Core中的注意事项 SQL Server数据库漏洞评估了解一下 预热ASP.NET MVC 的VIEW [AUTOMAPPER]反射自动注册AUTOMAPPER PROFILE

    TransactionScope事务处理方法介绍及.NET Core中的注意事项   作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/10170712.ht ...

随机推荐

  1. 原生javascript开发仿微信打飞机小游戏

    今天闲来无事,于是就打算教一个初学javascript的女童鞋写点东西,因此为了兼顾趣味性与简易程度,果断想到了微信的打飞机小游戏.. 本来想用html5做的,但是毕竟人家才初学,连jquery都还不 ...

  2. Oracle数据库中文乱码问题

    最近碰到Oracle乱码问题,刚开始甚是头疼,以前在合肥出差的时候,这种问题也碰到过,当时直接抛给了“乌压压一片”(一个搞数据的同事儿),这次没办法躲过,只好硬着头皮上.虽然我这次碰到的是Oracle ...

  3. 如何利用Dreamwever快速创建表格???

    这样的一张表,用table写完感觉好累,很多单元格都不一样大,还要单独设置样式,今天还分享下用Dreamwever快速创建表格. 可能这会有人知道了!当然是插入表格了!

  4. 【转载】C++编译出现 error C2664: 不能将参数 2 从“const char [5]”转换为“LPCTSTR”解决办法。

    编译程序的时候出现这样的错误,原因是在新建MFC项目的时候,设置字符集Unicode的属性. 解决方法一: 在VC2010的解决方案管理器窗口内,右击你的项目“项目”,然后选“属性”(最后一项),再点 ...

  5. 微信电脑版也能用公众号自定义菜单 微信1.2 for Windows发布

    昨日,微信电脑版发布更新,版本为微信1.2 for Windows,最大的特色就是加入了保存聊天记录功能,可以使用公账号菜单,手机上收藏的表情也能在电脑版上发送,可以接收转账消息. 本次微信pc版更新 ...

  6. maven mirror repository

    简单点来说,repository就是个仓库.maven里有两种仓库,本地仓库和远程仓库.远程仓库相当于公共的仓库,大家都能看到.本地仓库是你本地的一个山寨版,只有你看的到,主要起缓存作用.当你向仓库请 ...

  7. javascript设计模式--备忘录模式(Memento)

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. mysql去除重复查询的SQL语句基本思路

    SELECT R.* FROM trans_flow R, (SELECT order_no, MAX(status_time) AS status_time FROM trans_flow GROU ...

  9. 判断一个字符串在至多删除k个字符后是否为回文串

    转自: http://www.careercup.com/question?id=6287528252407808 问题描述: A k-palindrome is a string which tra ...

  10. poj 2749

    Building roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6091   Accepted: 2046 De ...