批次設定執行預存程序的權限給特定使用者

最近在更動資料庫的權限設定,發現有個帳號的權限設成是 db_owner,所以它有權限可以新增、刪除資料庫裏的資料表。權限有點過大。所以就將它改成只有db_datareader及db_datawriter的權限。

但後來發現原本這組帳號也需要可以執行所有的預存程序。一但改為只有db_datareader及db_datawriter的話,就沒有權限可以去執行預存程序了。但如果要透過MS SQL管理介面來設定的話,又要一個個進去設定,相當費時間。

於是就開始尋找看是否有T-SQL的指令可以批次來設定預存程序的執行權限給某組帳號。發現MS SQL本身並沒有函式可用來批次設定。但找到有一位提供的解答是用T-SQL指令來產生所需的GRANT指令

大致上的方式是用查詢資料庫預設資料表INFORMATION_SCHEMA.ROUTINES來找出目前使用的資料庫中所建立的所有預存程序資訊。

可以用如下的指令來產生所需的T-SQL指令:


SELECT 'GRANT EXEC ON ' +
QUOTENAME(ROUTINE_NAME) + ' TO ' FROM INFORMATION_SCHEMA.ROUTINES

不過,後來發現並不是所有的預存程序都可以指定EXEC的權限,有些預存程序如果是函數型,且傳回值為一個TABLE的話,那這種預存程序就只能指定授權SELECT的權限而已。



所以比較正確的指令應該是如下。分成兩種模式。一種是授權EXEC;另一種授權SELECT。


SELECT 'GRANT EXEC ON ' +
QUOTENAME(ROUTINE_NAME) + ' TO user-account' FROM INFORMATION_SCHEMA.ROUTINES
where DATA_TYPE <> 'TABLE' OR DATA_TYPE is NULL

SELECT 'GRANT SELECT ON ' +
QUOTENAME(ROUTINE_NAME) + ' TO user-account' FROM INFORMATION_SCHEMA.ROUTINES
where DATA_TYPE = 'TABLE'

留言

這個網誌中的熱門文章

DOS Batch指令檔中如何記錄log資訊

用捷徑方式執行需帶入命令列參數的Windows Form程式

使用regular expression來match中括號(square bracket)