前言:
說數據庫權限控制,首先簡單瞭解下數據庫中存在的兩種角色:服務器角色和數據庫角色。
服務器角色:
內置服務器角色 | 說明 |
sysadmin | 系統管理員,擁有sql server所有的權限許可。 |
serveradmin | 服務器管理員,管理sql server服務器端設置 |
setupadmin | 設置管理員,管理鏈接服務器和啓動過程,建立數據庫複製以及管理擴展存儲過程 |
securityadmin | 安全管理員,管理登錄和create database權限,讀取錯誤日誌和更改密碼 |
processadmin | 進程管理員,管理在sql server中運行的進程 |
dbcreator | 數據庫創建者,創建、更改和刪除數據庫 |
diskadmin | 磁盤管理員,管理磁盤文件 |
bulkadmin | 可執行大容量數據添加操作語句(bulk insert) |
數據庫角色:
內置數據庫角色 | 說明 |
public | 爲數據庫用戶維護默認的許可權限,每個用戶都是public角色的成員 |
db_owner | 數據庫所有者 |
db_accessadmin | 數據庫訪問管理員,可添加或刪除數據庫用戶 |
db_ddladmin | 數據庫DDL管理員,可添加、修改或除去數據中的對象 |
db_securityadmin | 數據庫安全管理員,管理數據庫的角色和成員、管理數據庫中語句和對象的權限 |
db_backupoperator | 數據庫備份操作員 |
db_datareader | 數據庫數據讀取者 |
db_datawritter | 數據庫數據寫入者,可添加、更改或刪除數據庫中的所有數據 |
db_denydatareader | 數據庫拒絕數據讀取者 |
db_denydatawriter | 數據庫拒絕數據寫入者 |
服務器角色控制服務器級別的權限,數據庫角色控制數據庫內數據對象的權限。在數據庫中,存在兩種賬戶,一個是登陸賬戶,一個是數據庫用戶,兩者區別顯而易見。
登陸賬戶是登陸到服務器,雖然具備對服務器具有相應的權限,並不意味着登陸賬戶對數據庫就有相應的權限。當一個用戶想訪問數據庫內的數據對象時,這時候數據庫用戶就發揮作用,因爲數據庫用戶可以對相應數據庫具有一定的操作權限,那麼sqlserver中,只要在數據庫中添加相應的數據庫用戶,使其關聯到指定的登陸賬戶,即可實現登陸賬戶訪問具體的數據庫,通過對數據庫用戶授權來控制登陸賬戶的權限。
在Sql server中,有兩個默認的數據庫用戶,即dbo和guest。dbo用戶存在於每個數據庫下,是數據庫管理員,它對應的登錄賬戶是sa,如果某個sql server登錄賬戶是sysadmin角色的成員並且該賬戶沒有映射用戶賬戶時,系統將自動將其映射爲每個數據庫中的dbo用戶。guest用戶則默認被加入到master、tempdb等系統數據庫中。
實例演示:
環境說明:
Microsoft SQL Server 2005 - 9.00.1399.06 (X64)
Oct 14 2005 00:35:21
/* Copyright (c) 1988-2005 Microsoft Corporation
Developer Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1)
*/
sqlserver中有數據庫testdb,數據庫中有表test1 ,test2
test1(col1,col2)
test2(col1,clo2)
創建代碼如下:
if not exists(select * from sys.databases where name='testdb')
create database testdb
go
use testdb
go
create table test1
(col1 int,
col2 int
)
go
create table test2
(
col1 int,
col2 int
)
insert into test1
select 0,1 union
select 2,3 union
select 4,5
insert into test2
select 2,4 union
select 3,5 union
select 6,6
management studio->安全性->登陸名-》右擊
分別新建兩個登陸賬戶:login1,login2
需求:
1) 通過權限控制,實現: login1對testdb中test1只有select權限
2)精確控制login2僅對test2中的某一列有select權限
上述準備工作做好後:
第一步:
在testdb數據庫下->安全性->用戶-》右擊
分別建立user1,user2
user1關聯登陸賬戶login1
user2關聯登陸賬戶login2
參考如下圖:
數據庫用戶user2設置同user1,參考上圖,這裏就不截圖了
未對user1授權時,通過login1登陸到服務器,並建立對testdb數據庫的查詢
結果如下:
第二步,開始對user1,user2設置權限:
設置user1的權限
確定後,如下圖:
確定後,我們就可以看到test1,test2了,點擊test1,勾選授予select,點擊test2勾選deny select權限具體如下圖:
此時我們再執行select時,結果如下:
2)如果要控制user2只能訪問test2的col2而不能訪問col1,除了對user2設置上述操作外,我們還應該設置如下:
以login2登陸服務器後運行結果如下:
總結:
個人覺得,總體把握sqlserver的授權機制比較重要,比如一個登陸賬戶是要關聯到對應的數據庫用戶才能訪問數據庫,具體對數據庫有沒什麼權限,取決於數據庫用戶是什麼數據庫角色的成員。把這個問題弄清楚了,很多設置其實思路應該就清晰多了。