2012-06-04 46 views
13

当我创建于2012年的SQL一个Visual Studio数据库项目,并将其与现有的数据库(使用比较模式)同步,我也同步SQL Server登录之前就存在。 Visual Studio中生成的登录下面的脚本:的Visual Studio数据库项目:检查是否SQL Server登录创建它

CREATE LOGIN [my_user] WITH PASSWORD = 'somesecurepass' 

当我尝试发布,其中该登录存在服务器上生成的SQL,SQLCMD显示我的错误:

The server principal my_user already exists. 

当我看由Visual Studio生成的SQL脚本,我发现许多对象都被包装在IF EXISTS语句中,但是CREATE LOGIN未被包装!

我试图手动敷在SQL脚本项目,但后来该项目不建并有指向如果一个错误:

SQL70001: This statement is not recognized in this context. 

现在我该怎样强制Visual Studio来生成使用IF EXISTS检查的登录创建脚本也不会失去同步功能?

+0

如何将用户移除到预部署脚本中?只是一个猜测...... – abx78

+0

@ abx78:是的,我想过了,但是我还必须将该登录的实际数据库用户创建移动到部署前(如果我不这样做,Visual Studio会在我说my_db_user对my_user登录有一个不好的引用)。再次 - 如果在将数据库部署到数据库之后,某人运行架构比较,则这些登录名和用户将像最初一样再次出现在项目中。 – JustAMartin

+0

我不明白为什么模式比较发现登录,如果它已经存在于目标中。 –

回答

21

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

生成操作属性通过右键单击Solution Explorer中的SQL文件,然后单击属性进行访问。或者,在解决方案资源管理器中突出显示该文件,然后按'F4'。

+2

这是愚蠢的答案。如果我们这样做,这个文件在发布时不会被执行!!!!!!!!!!!!!!!!!!!! – BJladu4

+1

这是美妙的答案。正是我在找什么!!!!!!!!!!!!!!!!!!!!!!!!!!!!! – Matt

+4

@ BJladu4,你可以使用像这样的':r。\ some-sql-file-set-to-none.sql'来执行另一个sql文件中的文件。还有,玩得很好@Matt,哈哈 – JohnnyFun

-1
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语句来处理它,但是你想这是否是更新密码到新的或简单地返回一个消息,说该用户已经存在。请告诉我,如果您需要帮助编写该部分。

+1

是的,我试过那个。如果在SQL管理工作室中使用它,但它在Visual Studio数据库项目中的查询中输入时不起作用。它给出了一个错误(IF行被加下划线的红色):SQL70001:这个语句在这个上下文中不被识别。很显然,Visual Studio数据库项目不允许IF在CREATE ... – JustAMartin

+0

脚本正确,但编译器在尝试构建时不喜欢该脚本。只需右键单击脚本文件并选择“从解决方案中排除”。该项目将建立,它会在需要引用该文件时找到该文件。让我知道这是不是一个可接受的解决方案。 – danmanallen

+0

@danmanallen我认为你的解决方案在部署时不会起作用。 – abx78

0

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

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

的问题是,也许你已经更改了密码,权限,或设置LOGIN [my_user]自创建以来,在丢弃并创建它之后,您将丢失该自定义设置。

1

不知道如果我理解正确的问题,但我来是因为类似的情况在这里。在浪费了几个小时后,用“if”和“try catch”这里是我的答案:

看着DacPac exclude users and logins on export or import我发现应该有一个选项排除登录。我发现你可以为数据库项目更改发布设置,但这些设置存储在* .user文件中,我通常不会将其放入源代码管理。进一步看,我发现命令行选项sqlpackage.exehttps://blogs.msdn.microsoft.com/ssdt/2015/02/23/new-advanced-publish-options-to-specify-object-types-to-exclude-or-not-drop/。这似乎工作相当不错,也因为你可以从的NuGet(见https://blogs.msdn.microsoft.com/ssdt/2016/08/22/releasing-ssdt-with-visual-studio-15-preview-4-and-introducing-ssdt-msbuild-nuget-package/)sqlpackage.exe得到。所以没有任何方法可以在CI机器上构建并将结果部署到服务器。

编辑: 这是在VS2015与各自的SSDT。

4

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

  1. 在Visual Studio中,在您的登录脚本右键单击,或在我的情况下链接的服务器脚本。
  2. 点击属性
  3. Under Advanced - >构建动作,将其从构建更改为
  4. 在您的PreDeployment脚本中,添加一行以运行此脚本。对我而言,我将链接的服务器脚本移动到与PreDeployment脚本相同的文件夹中。然后,我可以做

    :r .\linkedserver.sql

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

非常感谢Dongminator ..这真的很有帮助,它拯救了我的生命.. – Bharat

相关问题