-->

Visual Studio的数据库项目:检查是否创建它之前就存在SQL Server登录(Visua

2019-06-25 04:38发布

当我创建于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的登录脚本创建检查存在的,也不会失去同步的能力?

Answer 1:

更改脚本文件(* .SQL)为无的生成操作属性。 这解决了问题。

生成操作属性通过右键单击Solution Explorer中的SQL文件,然后单击属性进行访问。 另外,突出Solution Explorer中的文件,然后按“F4”。



Answer 2:

对于任何人谁是寻找一个完整的答案,这里是我做的:

  1. 在Visual Studio中,在你的登录脚本右键单击,或在我的情况下链接的服务器脚本。
  2. 单击属性
  3. 在高级- > 生成操作 ,它从构建更改为
  4. 在你部署前的脚本,添加一行运行此脚本。 对于我来说,我提出我的链接服务器的脚本是在同一文件夹中部署前的脚本。 然后,我可以做

    :r .\linkedserver.sql

  5. 当您部署decpac,您的登录脚本或链接服务器脚本将被成功执行。


Answer 3:

不知道如果我理解正确的问题,但我来是因为类似的情况在这里。 浪费了几个小时后,“如果”和“尝试捕获”这里就是我的回答:

纵观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。



Answer 4:

我有完全同样的问题,从我的解决办法是有一个预先部署脚本,删除用户:

IF EXISTS(SELECT TOP 1 1 FROM master.sys.server_principals WHERE name = 'my_user') BEGIN
   DROP LOGIN [my_user]
END

问题是,也许你已经更改了密码,权限,或设置LOGIN [my_user]因为它是建立和滴速和创建后,你会失去了自定义设置。



Answer 5:

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