T-Sql(七)用戶權限操作(grant)


  一般數據庫的權限操作我們很少用,除非一些大型的項目,需要給數據庫配置不同的用戶及權限,防患於未然,今天我們就來了解下t-sql中配置用戶權限操作。

  先看示例代碼:

 1 --創建登錄名
 2 create login text1
 3 with password='password1',
 4 check_policy =off;
 5 
 6 --修改登錄名
 7 alter login text1
 8 with name = test1
 9 go
10 alter login test1 disable
11 
12 --修改登錄名密碼
13 alter login test1
14 with password='123456'
15 old_password='password1';
16 
17 --刪除登錄名
18 drop login test1
19 ----------------
20 --創建用戶
21 use AdventureWorks
22 create user user1
23 for login text1
24 
25 --修改用戶
26 alter user user1
27 with name=use2;
28 
29 --刪除用戶
30 drop user user2
31 
32 --查看當前數據庫對應的用戶
33 select USER_NAME()
34 SELECT CURRENT_USER AS 'Current User Name';

  這些語法都很簡單我們主需要記住就行,當然通過SQLSERVER的可視化界面也可以配置。

  下面我們也通過一個實例來理解和運用配置用戶權限。

  實例要求:

    1.建立兩個用戶,user1,user2
    2.user1具有操作數據庫ExamMis的所有權限
    3.轉換上下文到USer1下,建立一個函數:f_GetQuestionDetails,該函數返回題目內容(包括題干,分題項,題型三個表的關聯內容)
    4.賦權限給user2:讓其只具有執行該函數的權限;
    5.轉換上下文到user2,執行函數調用。

1,建立兩個用戶,user1,user2

  創建兩個登陸名,並在為登陸名創建user1和user2用戶。

  示例代碼:

 1 create login TestUser1
 2 with password='password1';
 3 
 4 create user User1
 5 for login TestUser1
 6 with default_schema=dbo;
 7 
 8 create login TestUser2
 9 with password='password2';
10 
11 create user User2
12 for login TestUser2

2,user1具有操作數據庫ExamMis的所有權限

  這個操作有三種方法:

    1,SQLSERVER可視化操作。

    2,grant all去給用戶分配權限。

    3,通過SQLSERVER系統自帶的存儲過程分配權限。

  這里我們先講一下grant的用法,grant是用來給用戶分配權限用的。

  我們先看一個示例代碼:

1 grant all 
2 on database::ExamMis
3 to User1
4 WITH GRANT OPTION

  這段代碼的意思就是給User1分配具有操作ExamMis數據庫的一切權限。all關鍵字的意思是所有權限,也可以指定某一權限,比如查詢權限就可以寫grant select,

  當然 on 后面也可以是表,函數,存儲過程,視圖等。

  示例代碼:

1 grant select,insert,update
2 on table::student
3 to User1
4 WITH GRANT OPTION

   這段代碼的意思是給用戶user1在student表分配具有查詢,插入,更新的權限,但是沒有刪除得權限。

  通過SQLSERVER系統自帶的存儲過程分配權限,示例代碼:

1 EXEC sp_addrolemember N'db_owner', N'User1' 

   sp_addrolemember是系統自帶的存儲過程,db_owner的意思是所有者,可視化操作的時候我們也會看到。當然還有一些其他的一些存儲過程,在文章的后面會給大家整理出來。

3,轉換上下文到User1下,建立一個函數:f_GetQuestionDetails

  執行上下面到User1下:

1 EXECUTE AS LOGIN = 'TestUser1'

  我們可以通過select USER_NAME(); 來查看當前用戶名。

  下面我們創建函數:f_GetQuestionDetails,函數具有返回值,返回table。

  示例代碼:

1 create function Select_Questions()
2 returns table
3 as
4 return
5 (
6     select t1.*,t2.TypeName,t2.Score,t3.SelectionNo,t3.SelectionTitle,t3.IsAnswer from dbo.Questions t1
7     inner join dbo.QuestionType t2 on t1.TypeNo=t2.[no]
8     inner join dbo.QuestionSelections t3 on t1.[no]=t3.QuestionNo
9 ); 

  函數的用法很簡單,就不單列去講解了,和我們編程時候用的方法類似,只是語法不同而已,大家熟悉用就行。

4,函數賦權限給user2:讓其只具有執行該函數的權限;

  這一步我們可以直接用上面提到的grant去給用戶user2分配權限。

  這里我們就多做一部,創建一個角色,然這個角色具有操作這個函數的權限,然后把角色分配給用戶user2。

  一般我們項目的權限管理都是這個設計:用戶->角色->權限。

  示例代碼:

1 create role Select_Fuction  --創建角色
2 
3 GRANT select
4    ON OBJECT::dbo.Select_Questions
5    TO Select_Fuction;
6 
7 exec sp_addrolemember 'Select_Fuction','User2'  --將Select_Fuction角色添加到User2用戶中

5.轉換上下文到user2,執行函數調用。

  示例代碼:

1 REVERT;
2 EXECUTE AS LOGIN = 'TestUser2'
3 select USER_NAME()
4 
5 select * from Select_Questions()

  REVERT;的意思是切換上下文。

   執行完操作我們把登陸名,用戶名刪掉:

1 drop function Select_Questions
2 drop login TestUser1
3 drop login TestUser2
4 drop user user1
5 drop user user2

 用戶權限配置系統存儲過程

 1 sp_addlogin 登錄名,登陸密碼,默認數據庫,默認語言,安全碼,是否加密
 2 sp_password 舊密碼,新密碼,指定登錄號
 3 sp_defaultdb 指定登錄號,默認數據庫
 4 sp_defaultlanguage 指定登錄號,默認語言
 5 sp_helplogins 指定登錄號
 6 sp_droplogin 指定登錄號
 7 
 8 -------------------------數據庫用戶管理---
 9 sp_grantdbaccess 登錄號,數據庫用戶名
10 sp_helpuser 數據庫用戶名
11 sp_revokedbaccess 指定數據庫用戶名
12 
13 ------------------------服務器角色--------
14 sp_addsrvrolermemeber 登陸賬號名,服務器角色名
15 sp_dropsrvrolermember 登陸用戶名,服務器角色名
16 
17 ------------------------數據庫角色---------
18 
19 sp_addrole 數據庫角色名,數據庫角色的所有者
20 sp_droprole 數據庫角色名
21 
22 ------------創建數據庫角色的成員----
23 
24 sp_addrolemember 數據庫角色名,數據庫用戶
25 sp_droprolemember 數據庫角色名,數據庫用戶

  t-sql中的用戶權限配置就講到這,這一部分的內容我們很少去涉及,但是還是了解一些,說不准哪天DB不在,經理讓你去配數據庫用戶呢,編程的都不會,就你會,自己是不是很有面子啊。哈哈。

  以后繼續整理一下編程相關的知識,請大家多多關注。。。

  


免責聲明!

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



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