2

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

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

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

我想这个问题的答案是否定的,但只是把它扔在这里以防万一。

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

4

3 回答 3

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%'
于 2013-08-21T07:37:34.793 回答
1

我为 SQL Server 2012 调整了上面的查询(谢谢@gvee)。

select o.name, ref.name, refc.name, * 
from sys.sql_expression_dependencies d 
inner join sys.objects o on o.object_id = d.referencing_id
inner join sys.objects ref on d.referenced_id = ref.object_id
left outer join sys.columns refc 
    on d.referenced_id = refc.object_id 
        and d.referenced_minor_id = refc.column_id
order by 1, 2, 3


select o.name,  OBJECT_SCHEMA_NAME(o.object_id), *
from sys.objects o
where o.type = 'P' and o.name not in ('sp_upgraddiagrams')
and not exists (
    select 1
    from  sys.dm_sql_referenced_entities(
        OBJECT_SCHEMA_NAME(o.object_id) + '.' + o.name, 'OBJECT')
    where is_updated = 1
)
order by 1

请注意,sys.dm_sql_referenced_entities不会返回is_updatedSQL 2008 中的列。

查询sp_upgraddiagrams会引发错误,但仍会返回结果集。

于 2013-08-21T08:50:31.247 回答
1

不确定是否sys.sql_dependencies可以始终依赖目录视图,但使用语句

select o.name, ref.name, refc.name, * 
from sys.sql_dependencies d 
inner join sys.objects o on o.object_id = d.object_id
inner join sys.objects ref on d.referenced_major_id = ref.object_id
left outer join sys.columns refc 
    on d.referenced_major_id = refc.object_id 
        and d.referenced_minor_id = refc.column_id
where is_updated = 1
order by 1, 2, 3

您可以找出哪些对象修改了其他对象。

基于此查询,我们可以选择使用 is_updated 标志标记的存储过程:

select o.name
from sys.objects o
where o.type = 'P' and o.object_id not in (
    select d.object_id from sys.sql_dependencies d where is_updated = 1
)
order by 1
于 2013-08-21T08:03:34.490 回答