如何允许执行存储过程但不能执行写操作?


11

我想在我的SQL Server 2012实例上设置一个“读取”用户。我想让他有权执行任何存储过程,函数或直接SQL语句,该语句从所有表和视图中检索数据,但不进行更新或插入(即,读取任何内容而不写入任何内容)。

我是否可以在不按名称专门授予每个函数或存储过程权限的情况下进行设置,而是授予他对任何函数或存储过程的执行权限,而只是取消修改表的权限?

如果我改为运行SQL Server 2008,会发生什么变化吗?

澄清和补充:

  1. 如果存储过程更改了数据,则用户应收到错误消息(拒绝修改或完全拒绝访问存储过程)。
  2. 如果潜在的解决方案涉及拒绝权限,我是否可以不授予某些权限而不是拒绝?
  3. 是否可以在一条语句中将拒绝应用于数据库中的所有表,视图等(现在和将来存在)?

我是新来的,请随时设置相应的标签,否则可以编辑问题
gt6989b 2014年

1
这就是@KrisGruttemeyer的想法-他可以执行它,但是会导致某种错误;或者,我可以拒绝执行他,只要我不必指定sp的列表即可,他有特权运行
gt6989b 2014年

1
在这种情况下,您需要阅读有关SQL Server权限的信息。有3种权限变体- GRANT授予权限,DENY拒绝权限以及 REVOKE删除GRANTDENY。没有GRANTDENY用户可以继承权限,例如从获得对存储过程的访问权限。
JNK 2014年

1
@ gt6989b如果您DENY DELETE, INSERT, UPDATE使用的是数据库或模式,我相信它只会影响表和视图。
JNK 2014年

1
@ gt6989b-仅注意这些注释中建议的答案被证明是不正确的。请参阅保罗·怀特的回应。
RLF 2014年

Answers:


15

这并不像您想的那样容易实现。一种方法是创建一个新的用户定义的数据库角色,为该角色提供所需的所有权限,然后将用户添加到新角色。这至少使得将来向用户(或其他用户定义的角色)授予此权限集更为容易。以下步骤是一个好的开始:

-- The user-defined role containing all required permissions
CREATE ROLE Readers AUTHORIZATION dbo;

-- Give read-only access to all tables,
-- views on those tables, and in-line
-- functions
ALTER ROLE db_datareader ADD MEMBER Readers;

-- Example: add a user (Bob) to the role
ALTER ROLE Readers ADD MEMBER Bob;

此后,Bob将在数据库中具有广泛的只读特权。他将能够读取所有表,这些表的视图以及内联函数。但是,他将无法执行任何过程或使用非内联函数。

您需要为读者角色授予特定的权限,以获取希望读者能够访问的安全功能和过程。您可以采取一些步骤来简化此过程(例如,将对象分组到一个架构中,并授予该架构(而不是单个对象)的执行权限),但是这里没有太多细节。

要注意的一件事是,如果要修改的过程和对象共享一个公共所有者,则缺少数据修改特权不会阻止Reader通过已授予执行权限的存储过程来更改数据。在这种情况下也不会尊重任何明确的否认。此功能称为所有权链接

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.