防止在具有动态查询的存储过程中更新/删除

时间:2014-01-28 04:37:25

标签: sql sql-server stored-procedures policy

有一个存储过程执行来自参数的动态查询。动态查询主要包含SELECT语句,但可能包含删除/更新一段时间。

当此过程尝试运行具有DELETE或UPDATE命令的动态查询时,我想引发错误。 例如..


create procedure spa_test

@sql varchar(2000)
AS
EXEC(@sql)
go
----------------------

SET @sql1 = ' DELETE FROM data_table where .... ;
                    ......... 
                    SELECT * FROM some_table ..  '

SET @sql2 = '....
                    ......... 
                    SELECT * FROM some_table   '


EXEC spa_test @sql1 -- should result in error
EXEC spa_test @sql2 -- no error and procedure runs successfully

我可以使用SQL Server策略管理来完成此操作吗? 我无法更改此过程spa_test,并且无法更改运行它的用户的权限。 还有其他方法可以满足这种需求吗?

1 个答案:

答案 0 :(得分:1)

您可以使用CHARINDEX()在@sql查询中搜索DELETE,UPDATE表达式。

CHARINDEX ( expressionToFind ,expressionToSearch)

-

IF (CHARINDEX(@sql1 , 'DELETE FROM') <> 0 or CHARINDEX(@sql1 , 'UPDATE') <> 0 )
   RAISERROR(...)
ELSE
   EXEC(@sql1)