使用GenerateDropsIfNotInProject部署数据库项目会删除数据库项目中的用户

时间:2012-08-14 16:31:23

标签: database-project

我已经与用户创建了一个数据库项目:

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]的连接

4 个答案:

答案 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>