有一个存储过程执行来自参数的动态查询。动态查询主要包含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,并且无法更改运行它的用户的权限。 还有其他方法可以满足这种需求吗?
答案 0 :(得分:1)
您可以使用CHARINDEX()在@sql
查询中搜索DELETE,UPDATE表达式。
CHARINDEX ( expressionToFind ,expressionToSearch)
-
IF (CHARINDEX(@sql1 , 'DELETE FROM') <> 0 or CHARINDEX(@sql1 , 'UPDATE') <> 0 )
RAISERROR(...)
ELSE
EXEC(@sql1)