轉 在SQL Server中創建用戶角色及授權(使用SQL語句)


 目錄
  1. 要想成功訪問 SQL Server 數據庫中的數據 我們需要兩個方面的授權
    1. 完整的代碼示例
  2. 使用存儲過程來完成用戶創建
    1. 實例

要想成功訪問 SQL Server 數據庫中的數據, 我們需要兩個方面的授權:

  1. 獲得准許連接 SQL Server 服務器的權利;
  2. 獲得訪問特定數據庫中數據的權利(select, update, delete, create table ...)。

假設,我們准備建立一個 dba 數據庫帳戶,用來管理數據庫 mydb。

1. 首先在 SQL Server 服務器級別,創建登陸帳戶(create login)

--創建登陸帳戶(create login)
create login dba with password='abcd1234@', default_database=mydb

登陸帳戶名為:“dba”,登陸密碼:abcd1234@”,默認連接到的數據庫:“mydb”。 這時候,dba 帳戶就可以連接到 SQL Server 服務器上了。但是此時還不能 訪問數據庫中的對象(嚴格的說,此時 dba 帳戶默認是 guest 數據庫用戶身份, 可以訪問 guest 能夠訪問的數據庫對象)。

要使 dba 帳戶能夠在 mydb 數據庫中訪問自己需要的對象, 需要在數據庫 mydb 中建立一個“數據庫用戶”,賦予這個“數據庫用戶” 某些訪問權限,並且把登陸帳戶“dba” 和這個“數據庫用戶” 映射起來。 習慣上,“數據庫用戶” 的名字和 “登陸帳戶”的名字相同,即:“dba”。 創建“數據庫用戶”和建立映射關系只需要一步即可完成:

2. 創建數據庫用戶(create user):

--為登陸賬戶創建數據庫用戶(create user),在mydb數據庫中的security中的user下可以找到新創建的dba
create user dba for login dba with default_schema=dbo

並指定數據庫用戶“dba” 的默認 schema 是“dbo”。這意味着 用戶“dba” 在執行“select * from t”,實際上執行的是 “select * from dbo.t”。

3. 通過加入數據庫角色,賦予數據庫用戶“dba”權限:

--通過加入數據庫角色,賦予數據庫用戶“db_owner”權限
exec sp_addrolemember 'db_owner', 'dba'

此時,dba 就可以全權管理數據庫 mydb 中的對象了。

如果想讓 SQL Server 登陸帳戶“dba”訪問多個數據庫,比如 mydb2。 可以讓 sa 執行下面的語句:

--讓 SQL Server 登陸帳戶“dba”訪問多個數據庫
use mydb2
go create user dba for login dba with default_schema=dbo
go exec sp_addrolemember 'db_owner', 'dba' go

此時,dba 就可以有兩個數據庫 mydb, mydb2 的管理權限了!

完整的代碼示例

 1 --創建數據庫mydb和mydb2
 2 --在mydb和mydb2中創建測試表,默認是dbo這個schema
 3 CREATE TABLE DEPT
 4        (DEPTNO int primary key,
 5         DNAME VARCHAR(14),
 6         LOC VARCHAR(13) );
 7 
 8 --插入數據
 9 INSERT INTO DEPT VALUES (101, 'ACCOUNTING', 'NEW YORK');
10 INSERT INTO DEPT VALUES (201, 'RESEARCH',   'DALLAS');
11 INSERT INTO DEPT VALUES (301, 'SALES',      'CHICAGO');
12 INSERT INTO DEPT VALUES (401, 'OPERATIONS', 'BOSTON');
13 
14 --查看數據庫schema, user 的存儲過程
15 select * from sys.database_principals
16 select * from sys.schemas 
17 select * from sys.server_principals
18 
19 --創建登陸帳戶(create login)
20 create login dba with password='abcd1234@', default_database=mydb
21 
22 --為登陸賬戶創建數據庫用戶(create user),在mydb數據庫中的security中的user下可以找到新創建的dba
23 create user dba for login dba with default_schema=dbo
24 
25 --通過加入數據庫角色,賦予數據庫用戶“db_owner”權限
26 exec sp_addrolemember 'db_owner', 'dba'
27 
28 --讓 SQL Server 登陸帳戶“dba”訪問多個數據庫
29 use mydb2
30 go create user dba for login dba with default_schema=dbo
31 go exec sp_addrolemember 'db_owner', 'dba'go
32 
33 --禁用登陸帳戶
34 alter login dba disable
35 --啟用登陸帳戶
36 alter login dba enable
37 --登陸帳戶改名
38 alter login dba with name=dba_tom
39 --登陸帳戶改密碼: 
40 alter login dba with password='aabb@ccdd'
41 --數據庫用戶改名: 
42 alter user dba with name=dba_tom
43 --更改數據庫用戶 defult_schema: 
44 alter user dba with default_schema=sales
45 --刪除數據庫用戶: 
46 drop user dba
47 --刪除 SQL Server登陸帳戶: 
48 drop login dba

 

使用存儲過程來完成用戶創建

下面一個實例來說明在sqlserver中如何使用存儲過程創建角色,重建登錄,以及如何為登錄授權等問題。

[sql]
  1.  1 /*--示例說明  
     2         示例在數據庫InsideTSQL2008中創建一個擁有表HR.Employees的所有權限、擁有表Sales.Orders的SELECT權限的角色r_test  
     3     隨后創建了一個登錄l_test,然后在數據庫InsideTSQL2008中為登錄l_test創建了用戶賬戶u_test  
     4     同時將用戶賬戶u_test添加到角色r_test中,使其通過權限繼承獲取了與角色r_test一樣的權限  
     5     最后使用DENY語句拒絕了用戶賬戶u_test對表HR.Employees的SELECT權限。  
     6     經過這樣的處理,使用l_test登錄SQL Server實例后,它只具有表Sales.Orders的select權限和對表HR.Employees出select外的所有權限。  
     7 --*/  
     8   
     9   
    10 USE InsideTSQL2008  
    11   
    12 --創建角色 r_test  
    13 EXEC sp_addrole 'r_test'  
    14   
    15 --添加登錄 l_test,設置密碼為pwd,默認數據庫為pubs  
    16 EXEC sp_addlogin 'l_test','a@cd123','InsideTSQL2008'  
    17   
    18 --為登錄 l_test 在數據庫 pubs 中添加安全賬戶 u_test  
    19 EXEC sp_grantdbaccess 'l_test','u_test'  
    20   
    21 --添加 u_test 為角色 r_test 的成員  
    22 EXEC sp_addrolemember 'r_test','u_test'  
    23   
    24   
    25 --用l_test登陸,發現在SSMS中找不到仍和表,因此執行下述兩條語句出錯。  
    26 select * from Sales.Orders  
    27 select * from HR.Employees  
    28   
    29 --授予角色 r_test 對 HR.Employees 表的所有權限  
    30 GRANT ALL ON HR.Employees TO r_test  
    31 --The ALL permission is deprecated and maintained only for compatibility.   
    32 --It DOES NOT imply ALL permissions defined on the entity.  
    33 --ALL 權限已不再推薦使用,並且只保留用於兼容性目的。它並不表示對實體定義了 ALL 權限。  
    34   
    35 --測試可以查詢表HR.Employees,但是Sales.Orders無法查詢  
    36 select * from HR.Employees  
    37   
    38   
    39 --如果要收回權限,可以使用如下語句。(可選擇執行)  
    40 revoke all on HR.Employees from r_test  
    41 --ALL 權限已不再推薦使用,並且只保留用於兼容性目的。它並不表示對實體定義了 ALL 權限。  
    42   
    43   
    44 --授予角色 r_test 對 Sales.Orders 表的 SELECT 權限  
    45 GRANT SELECT ON Sales.Orders TO r_test  
    46   
    47 --用l_test登陸,發現可以查詢Sales.Orders和HR.Employees兩張表  
    48 select * from Sales.Orders  
    49 select * from HR.Employees  
    50   
    51 --拒絕安全賬戶 u_test 對 HR.Employees 表的 SELECT 權限  
    52 DENY SELECT ON HR.Employees TO u_test  
    53   
    54 --再次執行查詢HR.Employees表的語句,提示:拒絕了對對象 'Employees' (數據庫 'InsideTSQL2008',架構 'HR')的 SELECT 權限。  
    55 select * from HR.Employees  
    56   
    57 --重新授權  
    58 GRANT SELECT ON HR.Employees TO u_test  
    59   
    60 --再次查詢,可以查詢出結果。  
    61 select * from HR.Employees  
    62   
    63   
    64 USE InsideTSQL2008  
    65 --從數據庫中刪除安全賬戶,failed  
    66 EXEC sp_revokedbaccess 'u_test'  
    67 --刪除角色 r_test,failed  
    68 EXEC sp_droprole 'r_test'  
    69 --刪除登錄 l_test,success  
    70 EXEC sp_droplogin 'l_test'  

     

 

revoke 與 deny的區別

revoke:收回之前被授予的權限

deny:拒絕給當前數據庫內的安全帳戶授予權限並防止安全帳戶通過其組或角色成員資格繼承權限。比如UserA所在的角色組有inset權限,但是我們Deny UserA使其沒有insert權限,那么以后即使UserA再怎么到其他含有Insert的角色組中去,還是沒有insert權限,除非該用戶被顯示授權。

簡單來說,deny就是將來都不許給,revoke就是收回已經給予的。

實例

[sql]

 1 GRANT INSERT ON TableA TO RoleA  
 2 GO  
 3 EXEC sp_addrolemember RoleA, 'UserA' -- 用戶UserA將有TableA的INSERT權限  
 4 GO  
 5   
 6 REVOKE INSERT ON TableA FROM RoleA -- 用戶UserA將沒有TableA的INSERT權限,收回權限  
 7 GO  
 8   
 9 GRANT INSERT ON TableA TORoleA --重新給RoleA以TableA的INSERT權限  
10 GO   
11   
12 DENY INSERT ON TableA TO UserA -- 雖然用戶UserA所在RoleA有TableA的INSERT權限,但UserA本身被DENY了,所以用戶UserA將沒有TableA的INSERT權限。  



免責聲明!

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



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