2014-01-28 44 views
0

有一個存儲過程執行動態查詢,該動態查詢將來自參數。動態查詢大多隻包含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

你可以添加自己的SP,將spa_test之前運行,提高錯誤? – cha

+0

或重命名真正的'spa_test'並將其包裝在一個執行檢查的新'spa_test' proc中(例如根據@ mhasan的回答) – StuartLC

+0

使您的表只讀,因此沒有人可以更新或刪除記錄...而不更改SP這是我在SQL Server中知道的唯一方法 –

回答

1

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

CHARINDEX (expressionToFind ,expressionToSearch) 

-

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

他無法更改StoreProcedure .......... –

+0

這是在調用存儲過程時檢查,檢查事先傳遞的參數 –