我在我的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')我怀疑性能永远不会是问题,因为这个脚本只会插入角色和权限。那么,检查每一行是否存在,并且只插入表中不存在的那些行,最干净的方法是什么?
发布于 2012-08-12 10:19:58
将每个插入语句包装在一个IF语句中将是可行的。但我不确定这是不是最干净的方法。
因此,您的第一个插入内容将变为:
IF NOT EXISTS(SELECT * FROM UserRole WHERE Name = 'Regular')
BEGIN
INSERT INTO [UserRole] ([Name])
SELECT 'Regular'
UNION ALL
SELECT 'Admin'
END发布于 2013-02-20 21:50:23
合并可以更干净,并且可以单独检查每一行,而不需要在每一行周围都使用IF语句。
http://coding.abel.nu/2012/08/idempotent-db-update-scripts/有一个很好的例子
https://stackoverflow.com/questions/11919086
复制相似问题