17

我正在尝试为 SSDT 数据库项目创建一个登录用户。登录名已存在于目标服务器上。使用以下 SQL:

CREATE USER [MyLogin]
        FOR LOGIN [MyLogin]
        WITH DEFAULT_SCHEMA = dbo

GO

我得到错误:

错误 1 ​​SQL71501:用户:[MyLogin] 对登录 [MyLogin] 的引用未解析。

我找到了两种解决方案,但都不适用于 2013:

1)创建一个服务器项目来引用登录。在当前版本的 SSDT / VS2013 中,这不是一个选项

2) 禁用模式检查。2013 年缺少该选项(我相信是Options -> Database Tools -> Schema Compare

4

2 回答 2

34

您实际上可以使用标准 T-SQL 语法在 SQL Server 数据库项目中创建服务器级登录:

CREATE LOGIN [Login_Name] WITH PASSWORD = '<Password>';

注意:您也可以右键单击数据库项目并选择“添加新项目”并导航到 SQL Server > 安全性(在模板对话框中)并选择“登录 (SQL Server)”。

这解决了 SQL71501 错误,并且(假设您使用 SQLPackage.exe 进行部署)将允许 SQLPackage.exe 在部署和发布之前将安全对象与目标数据库进行比较。

希望有帮助:)

于 2014-02-11T03:30:57.173 回答
2

如果您保证可以在服务器上登录,最好的办法是调整您的主 dacpac 文件。这里有一些关于如何执行此操作的说明:http: //sqlproj.com/index.php/2013/02/how-to-add-objects-to-master-dacpac

或者,您可以从 SSDT 部分删除对登录名的引用,并在部署后脚本中处理它。如果您有任何需要在不同服务器(开发、QA、生产)中应用不同权限的环境,那可能是更好的选择。我在这里写过博客:http: //schottsql.blogspot.com/2013/05/ssdt-setting-different-permissions-per.html

希望其中之一会有所帮助。我实际上使用第一个选项来解决需要使用 EXECUTE AS 的问题,这需要用户在项目中。获得确切的 XML 有点棘手,但我通过创建一个仅使用该登录名的空项目、构建它并将 XML 从 dacpac 复制到主 dacpac 来解决它。

于 2013-11-08T13:43:28.037 回答