SQL Server數據庫有完善的權限管理機制,對於存儲過程,其權限分為查看定義,執行和修改,查看SP定義的權限是:VIEW DEFINITION ,執行存儲過程的權限是:EXECUTE,修改SP的權限是:ALTER,但是該權限也能修改表結構,視圖的定義等數據庫對象。數據的讀取權限是SELECT,這個查看定義是不同的權限。對於一個數據表,如果僅授予VIEW DEFINITION權限,而沒有授予SELECT權限,那么用戶只能查看數據表的結構(Schema),而無法查看表中存儲的數據。
在管理權限時,可以給特定的用戶授予“只能讀取數據和執行SP,而不能修改數據”的權限,也就是,使特定的用戶只能查看數據(只讀,SELECT),只能查看定義(VIEW DEFINITION),和執行SP的權限(EXECUTE),這樣的權限設置,既能使用戶查看到業務數據,又能避免用戶私自修改數據。
對於數據的讀取權限,SQL Server內置固定數據庫角色 db_datareader,把用戶添加到該角色中,用戶就被授予了對數據庫中所有數據(表或視圖)的讀取權限,就是說,用戶可以對數據表或視圖執行select命令讀取數據;也可以逆向思考,不允許用戶修改數據,把用戶添加到固定數據庫角色 db_denydatawriter 中,這樣,用戶不能添加,更新和刪除任何數據,就是說,不能對任何數據表執行insert,updae和delete命令。這兩個數據庫角色,相當於以下兩個命令:
grant select to [domain\user]; deny update,delete,insert to [domain\user];
權限的分配分為:授予(grant)和拒絕(deny),對於已分配的權限,也可以通過回收(revoke)命令收回,權限管理是個技術活。
一,授予查看定義的權限
查看數據庫對象的權限是VIEW DEFINITION,通常數據庫對象是指:數據表,視圖,存儲過程,函數等,被授予VIEW DEFINITION權限之后,用戶只能查看定義,而無法從數據表或視圖中查看數據,無法執行SP和函數等。
1,授予SQL Server實例級別的查看定義的權限
以下代碼用於授予權限VIEW ANY DEFINITION,代碼必須在master數據庫中執行,使指定的用戶能夠查看當前SQL Server實例中的所有數據庫對象的定義:
use master go grant view any definition to [domain\user]
2,授予User,只能查看當前數據庫對象的定義的權限
以下代碼用於授予VIEW DEFINITION,使指定的用戶能夠查看指定數據庫中的所有對象的定義:
use db_name go grant view definition to [domain\user]
3,授予User,只能查看當前數據庫的指定數據庫對象的定義的權限
以下代碼用於授予VIEW DEFINITION,通過on子句,使指定的用戶能夠查看指定對象的定義:
use db_name go grant view definition on object::schema_name.object_name to [domain\user]
二,授予執行存儲過程的權限
以下代碼授予用戶執行存儲過程的權限,通過on子句指定用戶只能執行特定的SP:
use db_name go grant execute on object::schema_name.object_name to [domain\user]
如果grant execute省略on子句,表示所有的SP,這樣,用戶可以執行數據庫中的所有SP:
use db_name go grant execute to [domain\user]
三,授予用戶修改存儲過程的權限
修改存儲過程的權限是ALTER,但是,ALTER同時也能修改表結構,視圖定義等數據庫對象,如下代碼所示:
GRANT ALTER TO [domain\user]
如果僅授予用戶修改SP的權限,那么必須逐個設置,或者把SP創建在獨立的schema下,通過授予用戶修改schema,達到控制用戶只修改SP的目的:
GRANT ALTER ON SCHEMA::proc_schema TO [domain\user]
四,授予用戶查看SP的定義,執行和修改SP的權限
通過GRANT子句,可以一次性把查看SP的定義,執行和修改SP的權限都授予指定的用戶:
GRANT ALTER, EXECUTE, VIEW DEFINITION ON SCHEMA::[proc_schema] TO [domain\user]
在GRANT子句中省略ON子句,表示授予用戶的權限作用於所有的數據庫對象,包括數據表,視圖,存儲過程,函數等。
五,授予Public用戶查看定義的權限
當Login沒有映射到相應的User時,該Login被映射到默認的Public,設置給用戶查看定義的權限,這樣,每個登陸到SQL Server實例的用戶,都可以查看定義。
use master go grant view any definition to public use dbn_ame go grant view definition to public
六,授予用戶查看定義,只讀數據和執行SP的權限
存儲過程 sp_msforeachdb @command 是微軟未公開的存儲過程,該存儲過程遍歷當前的SQL Server實例的所有數據庫,在每個數據庫中執行相同的命令:

use master go create login [domain\user] from windows; go grant view any definition to [domain\user] ; go exec sp_msforeachdb ' use [?]; if not exists ( select * from sys.database_principals where name=''domain\user'' ) create user [domain\user] for login [domain\user]; alter role db_datareader add member [domain\user]; grant execute to [domain\user]; ' go
遍歷數據庫的功能,也可以使用游標來實現,本文不再贅述。
參考文檔:
Run same command on all SQL Server databases without cursors
Granting View Definition Permission to a User or Role in SQL Server