我已经与用户创建了一个数据库项目:
TimTestUser.user.sql
CREATE USER [TimTestUser]
FOR LOGIN [TimTestLogin]
并且还在服务器项目中创建了一个Login TimTestLogin.login.sql
CREATE LOGIN TimTestLogin WITH PASSWORD = 'tim'
在Database.sqldeployment中我选择了: 为目标数据库中的对象生成drop语句
当我部署数据库项目时,用户会被删除然后重新创建,这会导致Login to User链接失败并且用户成为孤儿。
更新
当我部署数据库项目时,生成了连接到[TimTestUser]的连接
答案 0 :(得分:2)
通过在将数据库导入项目时选中“导入权限”选项(默认情况下未选中),可以在Visual Studio 2013中使用SQL Server数据库项目时避免此问题。
这样做会在Security目录中创建一个Permissions.sql文件,其中包含每个用户的GRANT语句:
GRANT CONNECT TO [MyUser] AS [dbo];
答案 1 :(得分:1)
我无法使上面的sqlpermissions解决方案正常工作。但是,为用户脚本添加授权权限声明对我有用。例如:
GRANT CONNECT TO [TimTestUser]
答案 2 :(得分:1)
在尝试将GRANT CONNECT添加为部署后脚本,并尝试在SQL Server Management Studio 2014中手动设置连接权限后重新生成全新的.sqlproj后,我发现BunnyStrider是正确的:您必须将GRANT CONNECT添加到CREATE USER所在的同一脚本文件中。以下是代码,所有这些文件都在Security文件夹中名为TimTestUser.sql的文件中:
CREATE USER [TimTestUser]
FOR LOGIN [TimTestLogin];
GO
GRANT CONNECT TO [TimTestUser];
GO
然后我通过删除包含GRANT CONNECT的导入向导生成的Permissions.sql以及我添加的部署后脚本以及连接仍然有效来确认此代码。然后我重新生成了部署脚本(双击* .Publish.xml文件并单击Generate Script)并验证REVOKE CONNECT TO [TimTestUser]已消失。
我们正在使用SQL Server 2014,Visual Studio 2012和SSDT 11.1.50717.0。
答案 3 :(得分:0)
Sql server在创建用户时隐式授予Connect
CREATE USER [TimTestUser]
当db项目构建和部署时,它无法在Database.sqlpermissions文件中找到CONNECT权限
解决方案是明确设置Connect Database.sqlpermissions
<PermissionStatement Action ="GRANT">
<Permission>CONNECT</Permission>
<Grantee>TimTestUser</Grantee>
</PermissionStatement>