一般數據庫的權限操作我們很少用,除非一些大型的項目,需要給數據庫配置不同的用戶及權限,防患於未然,今天我們就來了解下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不在,經理讓你去配數據庫用戶呢,編程的都不會,就你會,自己是不是很有面子啊。哈哈。
以后繼續整理一下編程相關的知識,請大家多多關注。。。
