首先理解什麼是登錄,什麼是用戶,什麼是角色:
登錄:SQL Server2005中,有兩種創建登錄的方式:一種是Windows驗證登錄;另一種是SQL Server身份驗證方式。“登錄方式”就好比辦公樓上使用不同類型的鎖,一旦選擇了使用什麼類型的鎖,就可以開始爲每位員工配發鑰匙,而這個鑰匙就是“登錄”。或稱“登錄名”,但員工只有進入大樓的權利,但卻沒有權限查看和使用裏面的資源(比如檔案櫃)。如果是sysadmin或securityadmin固定服務器角色的成員,則可以創建兩種類型的登錄之一:標準登錄(比如前面比喻中的金屬鑰匙)和Windows登錄(比如較新型的電子出入卡)。
用戶:既然員工擁有了進入大樓的鑰匙,就應該擁有適當的管理性訪問權,他們需要通過訪問其他資源來完成工作。例如,如果打算允許財務部訪問賬目文件,就需要給他們一把文件櫃的鑰匙。員工現在有兩把鑰匙:一把是打開大門的鑰匙,一把是打開文件櫃的鑰匙。
同樣,一旦用戶已登錄到了SQL Server上,就需要允許用戶訪問數據庫。爲此,需要創建數據庫用戶賬戶,然後給這些用戶賬戶授予權限。一旦這個過程結束,SQL Server用戶就擁有了多把鑰匙:一把打開大門的鑰匙(登錄),以及一把打開他們需要訪問的每個文件櫃(數據庫)的鑰匙。
角色:會計需要簽發公司支票,這個權限可以用兩種方式之一來授予。第一,可以給每名會計分別提供一本從同一賬戶中支取的支票簿,並授予從該支票簿中開支票的權限。在這種情況下,需要設法跟蹤當月已經開出的全部支票,否則這種方法可能會造成可怕的後果。完成這項工作的最佳方法是讓整個公司賬戶只使用一本支票簿,並給所有會計授予從這本支票簿中開支票的一個組權限。
在SQL Server中,當幾個用戶需要訪問數據庫的權限時,比較容易的方法是將所有的權限作爲一個組授給他們,而不是設法分別管理每個用戶。
言歸正傳,先用存儲過程實現以上操作:
創建新登錄 具體語法請參考MSDN文檔
--創建一個簡單的登錄,登錄名爲:newlogin;登錄密碼:123456;默認數據庫:master,默認數據庫也可以不指定。
EXEC sp_addlogin 'newlogin','123456','master'
--創建用戶
--創建一個簡單的用戶,如果不指定用戶名,則添加到當前數據庫登錄名中,如果不指定角色,則該用戶默認屬於public角色。下爲添加newlogin登錄名。
EXEC sp_adduser 'newlogin'
--創建一個帶用戶名的用戶,用戶可以與登錄名相同(同上一種類似),也可以不同,但要設定當前登錄名,用戶角色可選,默認爲public。下爲將用戶newuser添加到newlogin登錄名中。
EXEC sp_adduser 'newlogin','newuser'
--創建角色
EXEC sp_addrole 'newrole'
--下爲將用戶下爲將用戶newuser添加到newlogin登錄名中。並指定newrole角色。
EXEC sp_adduser 'newlogin','newuser','newrole'
--爲角色newrole賦予jobs表的所有權限
GRANT ALL ON jobs TO newrole
--爲角色newrole賦予sales表的查、改權限
GRANT SELECT,UPDATE ON sales TO newrole
--禁止角色newrole使用employees表的插入權限
DENY INSERT ON employees TO newrole
另一種創建用戶和賦予角色的方式
--爲登錄newlogin在數據庫中添加安全賬戶newuser
EXEC sp_grantdbaccess 'newlogin,'newuser'
--添加newuser爲角色newrole的成員
EXEC sp_addrolemember 'newrole','newuser'
--數據庫用戶、角色、登錄的刪除操作
--刪除當前數據庫用戶
EXEC sp_revokedbaccess 'newuser';
--刪除數據庫登錄
EXEC sp_droplogin 'newlogin'
--刪除數據庫角色
EXEC sp_droprole 'newrole'
--從數據庫角色(newrole)中刪除用戶(newuser)
EXEC sp_droprolemember 'newrole', 'newuser'
--用SQL代碼新建登錄、用戶
--創建帶密碼的mylogin登錄名,MUST_CHANGE 選項需要用戶首次連接服務器時更改此密碼。
CREATE LOGIN mylogin WITH PASSWORD = '123456' MUST_CHANGE;
--創建映射到憑據的登錄名。
--以下示例將創建mylogin登錄名。此登錄名將映射到mycredential憑據。
CREATE LOGIN mylogin WITH PASSWORD = '123456',
CREDENTIAL = mycredential;
--從Windows 域帳戶創建登錄名
--如果從Windows 域帳戶映射登錄名,則登錄名必須用方括號([ ]) 括起來。
CREATE LOGIN [jack/xiangzhao] FROM WINDOWS;
--如果指定用戶名,則不使用默認登錄名作爲該數據庫用戶
CREATE USER myuser FOR LOGIN mylogin
--以下示例將創建用戶myuser擁有的數據庫角色myrole
CREATE ROLE myrole AUTHORIZATION myuser;
--以下示例將創建db_role固定數據庫角色擁有的數據庫角色myrole
CREATE ROLE myrole AUTHORIZATION db_role;