一般數據庫的權限操作我們很少用,除非一些大型的項目,需要給數據庫配置不同的用戶及權限,防患于未然,今天我們就來了解下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不在,經理讓你去配數據庫用戶呢,編程的都不會,就你會,自己是不是很有面子啊。哈哈。
以后繼續整理一下編程相關的知識,請大家多多關注。。。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
