是否有可能获得只读取数据的存储过程列表?

Moe*_*sko 2 t-sql sql-server

使用SQL Server 2012.您可以使用TSQL获取存储过程的列表,如下所示:

select * from information_schema.routines r where r.ROUTINE_TYPE = 'PROCEDURE'
Run Code Online (Sandbox Code Playgroud)

有没有办法只获取只读取数据的存储过程的子集(即不要在其中尝试INSERT或UPDATE语句,或者它们调用的任何存储过程).

我在想这个问题的答案是否定的,但是为了以防万一,只是把它放在这里.

最终目标是尝试创建一个数据库角色,该角色只能读取数据库中的数据,而不能修改它.db_datareader角色有帮助,但也希望能够调用只读取数据的存储过程.最后一种方法是为每个存储过程授予执行权限.

gve*_*vee 5

假设您的存储过程编码是一致的(例如,您总是使用EXEC显式调用存储过程而不仅仅是其名称),那么您可以使用以下代码获得良好的开端.

SELECT Object_Name(object_id)
     , *
FROM   sys.sql_modules
WHERE  definition NOT LIKE '%EXEC %'
AND    definition NOT LIKE '%INSERT%'
AND    definition NOT LIKE '%UPDATE%'
AND    definition NOT LIKE '%DELETE%'
AND    definition NOT LIKE '%MERGE%'
Run Code Online (Sandbox Code Playgroud)