当我创建于2012年的SQL一个Visual Studio数据库项目,并将其与现有的数据库(使用比较模式)同步,我也同步SQL Server登录。 Visual Studio中生成的登录下面的脚本:
CREATE LOGIN [my_user] WITH PASSWORD = 'somesecurepass'
当我尝试发布这个地方存在登录的服务器上生成的SQL,SQLCMD显示我的错误:
The server principal my_user already exists.
当我看由Visual Studio生成的SQL脚本,我看到许多对象被包裹在IF EXISTS语句,但是CREATE LOGIN不裹!
我试图手动敷在SQL脚本项目,但后来该项目不建并有指向IF的错误:
SQL70001: This statement is not recognized in this context.
现在,如何强制Visual Studio来生成与IF的登录脚本创建检查存在的,也不会失去同步的能力?
更改脚本文件(* .SQL)为无的生成操作属性。 这解决了问题。
生成操作属性通过右键单击Solution Explorer中的SQL文件,然后单击属性进行访问。 另外,突出Solution Explorer中的文件,然后按“F4”。
不知道如果我理解正确的问题,但我来是因为类似的情况在这里。 浪费了几个小时后,“如果”和“尝试捕获”这里就是我的回答:
纵观DacPac排除用户和登录出口或进口 ,我发现应该排除登录的选项。 我发现,你可以改变一个数据库项目发布设置 ,但这些设置保存在*。用户文件,我通常不会付诸源控制。 进一步看,我发现命令行选项sqlpackage.exe https://blogs.msdn.microsoft.com/ssdt/2015/02/23/new-advanced-publish-options-to-specify-object-types-to-排除有或没有降/ 。 这似乎工作相当不错,也因为你可以从的NuGet sqlpackage.exe得到(见https://blogs.msdn.microsoft.com/ssdt/2016/08/22/releasing-ssdt-with-visual-studio- 15预览-4-和引入-SSDT-的msbuild-的NuGet封装/ )。 因此,有没有什么建立一个CI机器上部署的结果到服务器的方式。
编辑 :这是与各自的SSDT VS2015。
我有完全同样的问题,从我的解决办法是有一个预先部署脚本,删除用户:
IF EXISTS(SELECT TOP 1 1 FROM master.sys.server_principals WHERE name = 'my_user') BEGIN
DROP LOGIN [my_user]
END
问题是,也许你已经更改了密码,权限,或设置LOGIN [my_user]
因为它是建立和滴速和创建后,你会失去了自定义设置。
IF NOT EXISTS
(
SELECT [Column Name Where Username Is Stored]
FROM [Table Name That Holds The Login's]
WHERE name = 'my_user'
)
BEGIN
CREATE LOGIN [my_user] WITH PASSWORD = 'somesecurepass'
ELSE....
然后,不过你想要这是否是更新密码到新的或简单地返回消息说,用户已经存在,你可以写一个else语句来处理它。 让我知道如果你需要帮助写的那部分。
文章来源: Visual Studio Database project: checking if SQL server login exists before creating it