SQL Server项目-如何发布存储过程权限



在我的.NET WinForms应用程序(在Visual Studio解决方案中(中,我在解决方案中的SQL Server项目中拥有表和存储过程,因此我可以轻松地将我的架构置于版本控制之下,并且我可以成功地使用"发布"功能将架构更改部署到开发数据库中。

我正准备部署我的应用程序,并要求用户在将新的应用程序和数据库架构更改发布到生产公司之前,在他们的PC上对照开发数据库试用该应用程序。

我发现应用程序正在抛出SqlException。我已经设法追踪到了对新存储过程的权限(很明显,作为存储过程的所有者,我没有这个问题(。

我可以通过授予存储过程的权限来手动更正此问题,如下所示

GRANT EXECUTE ON [dbo].[<tablename(s)>] TO DatabaseUsers

但我最理想的做法是将其包含在受版本控制的SQL Server项目中存储过程的定义中。

我已经尝试将上面的语句添加到SQL Server项目中存储过程定义的末尾(如下(,部署脚本的输出似乎显示了正在执行的命令,但在更新存储过程时,它不会触及权限。

-- Snipped 50 lines above for brevity
OR              c.name LIKE @search
OR              CAST(it.id AS VARCHAR) LIKE @search
OR              ig.name LIKE @search
ORDER BY        it.id
END
GRANT EXECUTE ON [dbo].[search_items_allfields] TO DatabaseUsers
GO

我还尝试在上述定义中的GRANT语句之前添加一个额外的GO,但随后我无法使用发布脚本,因为它由于无法解析组"DatabaseUsers"而拒绝运行(如果没有GO,它仍然无法解析它,但很乐意运行它(。

除了GRANT之前的GO(因此它不是过程的一部分(之外,您还需要将角色的脚本添加到项目中以解决引用:

CREATE ROLE DatabaseUsers;
GO

当然,您还需要添加角色成员。我建议您单独管理角色成员身份,而不是SSDT项目的一部分,因为这些成员身份会因环境而异,而且许多组织都有单独的过程来管理数据库访问安全性。

最新更新