2015-01-20 30 views
3

我在VS 2013中创建了2个SQL Server数据库项目,并从驻留在同一SQL实例上的2个数据库导入了模式。两个数据库都有SQL用户,比如说[MyUser1]和[MyUser2],它们使用单​​个SQL登录,比如说[MyLogin]。问题是这两个项目要创建的SQL登录,这将导致错误SQL登录已存在的错误

“SQL71508该模型已经有一个具有相同的名称MyLogin元素”

DB1项目

CREATE LOGIN [MyLogin] WITH PASSWORD = N'xyz';

CREATE USER [MyUser1] FOR LOGIN [MyLogin];

DB2项目

CREATE LOGIN [MyLogin] WITH PASSWORD = N'xyz';

CREATE USER [MyUser2] FOR LOGIN [MyLogin];

我已经试过:

  1. 去除的项目之一创建登录。问题是,然后CREATE USER生成一个错误,因为它希望登录的CREATE LOGIN存在。
  2. 要找到一种方法来忽略错误,但我发现的是如何忽略警告。
  3. 使用以下命令来检查登录是否已经存在,但是在“If”指示“SQL700001在该上下文中不能识别该语句”时生成错误。

    If Not Exists (Select name From master.sys.server_principals Where name = 'MyLogin') Begin CREATE LOGIN [MyLogin] WITH PASSWORD = N'xyz'; End

有没有人对如何解决此问题,纠正或工作有什么想法?谢谢!

此外,我创建DB2项目的主要原因是由于DB1中基于DB2中的表的视图。如果没有在DB1项目中引用的DB2项目,创建视图的SQL就会生成有关在DB2中查找表的错误。所以,如果有人对如何解决这个问题有任何想法,那也是有帮助的。

+0

您可以从项目中删除登录,将模式比较选项设置为忽略它们,以便它们不会回来,并在后期部署脚本中自行处理它们。 – stuartd 2015-01-20 22:29:05

+1

您也可以创建一个单独的项目,将登录名和用户放入其中,并从每个其他项目中添加数据库“自我”引用。 – 2015-01-20 22:39:29

+0

Ed Elliot是正确的。切勿在SSDT项目中两次添加相同的项目。在多个项目中存在相同项目的情况下,为服务器创建一个主项目。让用户独立,只需将登录移动到一个公共项目。在设计SSDT项目时考虑继承。不要忘记包含IncludeCompositeObjects开关以部署每个单独的数据库。 – HeXanon 2015-01-21 06:07:40

回答

2

永远不要在SSDT项目中两次添加相同的项目。在多个项目中存在相同项目的情况下,为服务器创建一个主项目。

让用户独自一人,只需将登录名移动到一个公共项目即可。

在设计SSDT项目时考虑继承。不要忘记包含IncludeCompositeObjects开关以部署每个单独的数据库。