sql-server - 是否可以获取仅读取数据的存储过程列表?

标签 sql-server tsql

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

select * from information_schema.routines r where r.ROUTINE_TYPE = 'PROCEDURE'

有没有办法只获取仅读取数据的存储过程的子集(即不要尝试在其中执行 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%'

关于sql-server - 是否可以获取仅读取数据的存储过程列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18351368/

相关文章:

c# - SQL Server-枢轴

sql - 创建一个为连接 session 的长度声明的变量?

sql-server - 在 SQL Server 2008 中将 NVARCHAR 转换为 INT 数据类型

asp.net - 独立的应用服务器和数据库服务器

sql - 对具有相同标识号的行求和并按自定义顺序排序

sql - 如何将 BINARY(8000) 列转换为 VARBINARY(MAX)

sql-server - DECLARE TABLE和CREATE TABLE有什么区别?

sql - 如何将映射表中的几行汇总为列?

sql - 在 SQL Server 中使用存储过程修改列

sql-server - 不清楚我需要哪种类型的锁来避免在唯一字段上重复插入