我想要一种简单的方法来为我的数据库创建只读用户。用户只有在不修改数据的情况下才应该有权执行存储过程。我不想弄清楚哪些存储过程是只读的,然后以这种方式授予权限,因为要处理的存储过程太多了。
当我读到下面的内容后,我认为这是可能的:
“存储过程可能既需要对存储过程的 EXECUTE 权限,又需要对存储过程引用的多个表的 INSERT 权限。”——http://technet.microsoft.com/en-us/library/ms191291.aspx
不幸的是,我能够执行一个“可执行”存储过程,并将其插入到“只读”用户表中。
答案1
MSDN 上的那条评论只是意味着在某些情况下(例如有时使用动态 SQL 时),授予用户对存储过程的 EXECUTE 权限并不一定足以允许他们执行它。
您想要的事情无法实现 - 如果他们能够运行存储过程,他们就能够执行存储过程所做的任何操作 - INSERT、DELETE、UPDATE 等等。甚至 SELECT 也可以通过 SELECT INTO 进行更改。而且总是有临时表或表变量使识别安全/不安全 sps 列表的任何尝试变得复杂。
我的建议是尽可能缩小只读用户实际需要读取的内容,创建一个仅对这些对象具有 EXECUTE 权限的数据库角色,然后从那里开始。我希望您没有向 Public 角色授予 EXECUTE 权限,因为如果是这样,您还必须拒绝对所有其他存储过程执行 EXECUTE。
答案2
不幸的是(据我所知)没有办法做到这一点。赋予用户(即使是只读用户)执行存储过程的能力意味着他们将能够执行该存储过程中的任何内容。