分享自 儒雅的男人blog http://www.cnblogs.com/yushaoye201314/archive/2013/04/19/3031203.html
好文,轉載收藏
這兩天在調用Microsoft.SqlServer.SMO.dll組件 《add login,create,backup,restore database to Sql Server using SMO》,接觸到一些數據庫的名詞定義:登錄名,用戶,角色,架構,權限,部分新人對幾個名詞的概念不是很清晰 所以參考部分文檔,摘錄如下(權當溫故⑧^_^):
SqlServer2008的安全機制分為四個級別:
1.操作系統的安全性
創建操作系統用戶賬號(win7):

2.數據庫服務器的登錄安全性【下面兩種驗證模式下登錄所使用的用戶名,即為:登錄名定義。】
數據庫服務器登錄模式分為:
①Windows身份驗證模式(如下圖)

用戶名即是:當前Windows操作系統中的用戶賬戶,我這里是用的管理員賬號(計算機名),如果系統賬戶有登錄密碼 可以相應的輸入
登錄成功后,設置SqlServer 驗證模式如圖:


②混合身份驗證模式(Windows身份驗證模式&SqlServer身份驗證模式[前者安全性比后者高]),如下圖:

在安裝SQLServer2008時 會默認生成一個登錄名:sa,其隸屬於服務器角色:sysadmin。
而新創建的登錄名,則會自動關聯服務器角色:public,除了默認的數據庫:master,其他的數據都將沒有訪問權限,如果想要訪問其他數據庫:
1.則需要在登錄名-新建-用戶映射里面勾選相應的數據庫:則相應的數據庫會自動創建一個同名(登錄名)數據庫用戶賬號
(注①:master數據庫不勾選也是默認訪問的 數據庫用戶里是沒有同名賬號。)
(注②:當登錄名要刪除之前 要先手動刪除由登錄名映射數據庫而生成的用戶)
2.或者在登錄名-新建-服務器角色 中直接勾選sysadmin這樣就可以訪問所有的數據庫(或在服務器角色sysadmin-右擊屬性-添加-登錄名)了:修改服務器角色為 sysadmin 不會在數據庫用戶里創建同名賬號。
以下是數據庫服務器的角色列表以及其對應所擁有的操作權限,如下圖:


3.數據庫的使用安全性
登錄名 只能登錄進SqlServer服務器,並不能讓訪問服務器中的數據庫,而使用登錄名登錄進數據庫服務器后想要訪問特定的數據庫 還必須具有數據庫用戶名,用戶名在特定的數據庫內創建,並必須關聯一個登錄名,通過授權給該用戶指定可以訪問的數據庫對象的權限
數據庫用戶可以新建或者由登錄名映射數據庫而生成。注:無論是新建的數據庫用戶 還是由登錄名映射數據庫生成的數據庫用戶 都要遵循 數據庫用戶1:1登錄名的規則
創建數據庫用戶時 需要關聯登錄名;創建數據庫角色是 需要關聯使用者 一般選擇dbo; dbo(DataBase Owner)是數據庫的所有者,擁有數據庫中的所有對象,每個數據庫都有dbo,sysadmin服務器角色的成員自動映射成dbo,無法刪除dbo,且此用戶始終出現在每個數據庫中。通常 登錄名sa映射為數據庫用戶dbo.
數據庫用戶的生成需要關聯數據庫角色:數據庫角色有三種:固定數據庫角色,用戶定義數據庫角色,應用程序角色,如下圖:

4.數據庫對象的使用安全性
我們一般將表,視圖,存儲過程,函數 統稱為數據庫對象,而數據庫對象包含在架構中,而給角色划分權限也就是開放架構中部分或者全部的對象做相應的執行權限操作,
數據庫對象的常用權限 如下圖:

權限操作分為三種:授予,拒絕,撤銷,語法及代碼如下
1 --授予權限操作 2 --語法:Grant {ALL|statement[,,,,n]} TO security_account[,,,n] 3 --授予角色"students_mag"對"studengs"數據庫中"stu"表 delete insert update權限 4 use students 5 go 6 grant delete,inster,update 7 on stu 8 to students_msg 9 go 10 --撤銷權限操作 11 --語法:revoke {all|statement[,,,n]} from security_account[,,,n] 12 --使用revoke 撤銷角色"students_mag"對"studengs"數據庫中"stu"表 delete insert update權限 13 use students 14 go 15 revoke delete,insert,update 16 on stu 17 from students_mag CASCADE 18 --拒絕權限操作 19 --deny {all|statement[,,,n]} to security_account[,,,n] 20 --在數據庫"students"的"stu"表中執行insert操作的權限授予了public角色,然后拒絕用戶guest擁有該項權限 21 use students 22 go 23 grant insert 24 on stu 25 to public 26 go 27 deny insert 28 on stu 29 to guest
在創建或生成數據庫用戶時 需要關聯架構,由登錄名映射數據庫生成的數據庫用戶 默認選擇了dbo,手動創建數據庫用戶,則選擇dbo,如下圖:

針對數據庫設置用戶/角色權限,如下圖:

總結:數據庫的安全和權限如下圖所示:

操作過程中相關的步驟、用T-SQL語句表示如下:
1.利用系統存儲過程sp_addsrvrolemember可將登錄名添加到某個固定服務器角色中
語法:exec sp_addsrvrolemember 'login',''role'
2.利用系統存儲過程sp_dropsrvrolemember可從固定服務器角色中刪除登錄名
語法:exec sp_dropsrvrolemember 'login','role'
3.利用系統存儲過程sp_srvrolepermission可以瀏覽固定服務器角色的權限
語法:exec sp_srvrolepermission 'role'
4.使用系統存儲過程瀏覽固定的數據庫角色
語法:exec sp_helpdbfixedrole
5.創建用戶自定義數據庫角色
語法:create role role_name [authorization owner_name] role_name:將要創建的數據庫角色名 owner_name:該角色擁有者的名字,必須是當前數據庫里的用戶或角色,默認為dbo
T-Sql:create role 'myRole'
使用存儲過程sp_addrolemember給新建數據庫角色設置已經存在的數據庫角色功能exec sp_addrolemember 'db_datareader','myRole'
使用存儲過程sp_droprolemember撤銷給新建數據庫角色所設置的已存在數據庫角色的功能exec sp_droprolemember 'db_datareader','myRole'
Proc示例:exec sp_addrole 'testRole','dbo'
5.1.刪除用戶自定義數據庫角色
語法:drop role testRole
proc:exec sp_droprole 'testRole'
6.創建數據庫服務器登錄名
T-Sql:create LOGIN lisi with password='111111'
Proc :exec sp_addlogin 'lisi' [,'111111' [,'master']]
7.修改登錄名 名稱和密碼
alter login lisi with name=lisi_new
alter login lisi_new with password='abcdef'
8.刪除登錄名
T-Sql:drop login lisi_new
Proc :exec sp_droplogin 'lisi_new'
8.1.禁用登錄名
alter login lisi_new disable
8.2.啟用登錄名
alter login lisi_new enable
9.創建數據庫用戶
T-Sql語法:create user user_name {for|from} login login_name
示例:use Sales go create user myUser from login lisi_new
9.1.創建帶有默認架構的數據庫用戶
語法:use Sales go
create user myUser from login lisi_new with default_schema=HRmanager
10.使用存儲過程sp_helpuser查看數據庫用戶
11.刪除數據庫用戶
T-Sql:drop user user_name
Proc :exec sp_dropuser 'user_name'
12.使用存儲過程sp_addrolemember給數據庫用戶設置固定數據庫角色功能
語法:exec sp_addrolemember 'role','security_account'
示例:exec sp_addrolemember 'db_datareader','myUser'
13.使用存儲過程sp_droprolemember撤銷給數據庫用戶所設置的固定數據庫角色功能
語法:exec sp_droprolemember 'role','security_account'
示例:exec sp_droprolemember 'db_datareader','myUser'
總結:關於數據庫服務器級的角色管理 與 數據庫級角色管理 如下圖


