使用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角色有帮助,但也希望能够调用只读取数据的存储过程.最后一种方法是为每个存储过程授予执行权限.
假设您的存储过程编码是一致的(例如,您总是使用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)