SQL Server 存储过程和其他数据库的权限

标签 sql sql-server database stored-procedures permissions

我正在为一些新用户配置数据库帐户。我提出了以下解决方案,99% 的方法都能让帐户正常工作,但我遇到了一个无法解决的问题。

首先,我创建了一个具有 SQL Server 身份验证的新登录名,然后授予他们对所有存储过程的 EXECUTE 权限。这允许他们运行所有这些,但他们无法查看代码,也无法查看数据库表。

在存储过程中我添加了以下内容:

WITH EXEC AS OWNER

这允许存储过程作为我们通常使用的默认帐户运行,并且具有db_owner的角色。这允许新用户运行所有存储过程,并且效果很好,直到我遇到以下问题:

一些存储过程(所有这些都使用动态 SQL)调用一些同义词,这些同义词链接到其他两个数据库(历史数据库和数据集市数据库)中的表。这给了我以下错误:

The server principal "{username}" is not able to access the database "{database name}" under the current security context.

我在 WITH EXEC AS 中使用的帐户是我正在使用的所有三个数据库的db_owner

我可以做什么来解决这个问题?非常感谢

最佳答案

EXECUTE AS Owner 是一个数据库沙箱。想一想,它必须。否则,数据库管理员可以发出EXECUTE AS USER = 'somesystemadmin'并将自己提升为实例级别管理员。详情参见 Extending Database Impersonation by Using EXECUTE AS :

when impersonating a principal by using the EXECUTE AS USER statement, or within a database-scoped module by using the EXECUTE AS clause, the scope of impersonation is restricted to the database by default. This means that references to objects outside the scope of the database will return an error.

解决方案很简单:签署程序。请参阅Call a procedure in another database from an activated procedure举个例子。欲了解更多信息,请访问 Module SigningSigning Stored Procedures in SQL Server .

关于SQL Server 存储过程和其他数据库的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28699072/

相关文章:

python - 在 Python 的 sqlite 表中创建自定义列名

sql - 加入多个选择查询 SQL

mysql - 现有数据 SQL 的订单下拉

sql - 获取sql中的查询计数

c# - csv 导入 sqlserver 没有重复使用 c#

java - 实现搜索功能 - 以字符串作为参数和通配符 % 的 eclipselink SQL

mysql - 如何以最小的冗余映射附加图像(例如 sqlite 表中的数据)?

.net - Sql事务已完成

php - 无法使用表单在数据库中插入值

database - 在数据库中存储问卷的有效方法是什么?