如何将sql用户权限限制为只读,同时仍允许存储过程执行?

这是我的目标:创build一个login和关联数据库用户的权限来select(只读),并优先存储过程不更新。

有点背景是这是SQL 2005,是一个有着十年历史和不愉快事物的数据库。 数以百计的存储过程,所有模式dbo。 我知道…

我有我的login和用户创build,并给予用户db_datareader权利。 我也必须授予EXECUTE perms才能运行任何proc,但是我的目标是禁止执行任何types的UPDATE / DELETE操作的任何proc。 试图单独设置这些过程中的烫发将是我不准备考虑的噩梦。

这种情况我描述可能吗?

一旦在存储过程中封装了逻辑,就不需要对基础对象的权限。 一种方法来完成你想要做的是在桌上的触发器。 就像是:

create trigger tr_del_tbl on tbl after delete as begin if user_name() = 'foobar' and exists (select 1 from deleted) rollback end 

我也使用一个angular色来做这个,而不是一个特定的用户。 这样,如果以后再获得另一个需要类似待遇的用户,则不必更改触发器; 你只需将它们添加到angular色。

没有基于权限的模型会这样做,除非您根据存储过程的function手动分配权限。 你唯一的select将是触发器。 请记住,只有在没有使用EXECUTE AS的情况下才能工作,这会改变user_name()函数报告的用户的方式。