Security4:授予查看定義,執行SP和只讀數據的權限


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
View Code

遍歷數據庫的功能,也可以使用游標來實現,本文不再贅述。

 

參考文檔:

Run same command on all SQL Server databases without cursors

Granting View Definition Permission to a User or Role in SQL Server


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM