Visual Studio数据库项目:在创建SQL服务器登录之前检查它是否存在

Jus*_*tin 14 sql-server login database-project visual-studio-2010

当我为SQL 2012创建Visual Studio数据库项目并将其与现有数据库同步(使用比较模式)时,我还同步SQL服务器登录.Visual Studio为登录生成以下脚本:

CREATE LOGIN [my_user] WITH PASSWORD = 'somesecurepass'
Run Code Online (Sandbox Code Playgroud)

当我尝试在存在此登录的服务器上发布生成的SQL时,sqlcmd向我显示错误:

The server principal my_user already exists.
Run Code Online (Sandbox Code Playgroud)

当我查看Visual Studio生成的sql脚本时,我看到许多对象都包含在IF EXISTS语句中,但是CREATE LOGIN没有被包装!

我试图在项目的SQL脚本中手动包装它,但是然后项目没有构建,并且指向IF的错误:

SQL70001: This statement is not recognized in this context.
Run Code Online (Sandbox Code Playgroud)

现在,如何强制Visual Studio使用IF EXISTS检查生成登录创建脚本,并且不会丢失同步功能?

小智 21

将脚本文件(*.sql)的Build Action属性更改为None.这解决了这个问题.

通过右键单击解决方案资源管理器中的sql文件,然后单击属性来访问构建操作属性.或者,在解决方案资源管理器中突出显示该文件,然后按"F4".

  • @ BJladu4,您可以使用类似`:r.\ some-sql-file-set-to-none.sql`之类的东西从另一个sql文件执行该文件.还有,好好玩@Matt,哈哈 (4认同)
  • 这是愚蠢的答案.如果我们这样做,发布时不会执行此文件!!!!!!!!!!!!!!!!!!!! (2认同)
  • 这是一个了不起的答案。正是我想要的!!!!!!!! (2认同)

Don*_*tor 5

对于正在寻找完整答案的其他人,这是我的工作:

  1. 在Visual Studio中,右键单击您的登录脚本,或者在本例中为链接服务器脚本。
  2. 单击属性
  3. 在“高级”->“ 构建动作”下,将其从“构建更改为“ 无”
  4. 在您的PreDeployment脚本中,添加一行以运行此脚本。对我来说,我将链接服务器脚本移动到与PreDeployment脚本相同的文件夹中。那我就可以

    :r .\linkedserver.sql

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