一般數(shù)據(jù)庫的權(quán)限操作我們很少用,除非一些大型的項(xiàng)目,需要給數(shù)據(jù)庫配置不同的用戶及權(quán)限,防患于未然,今天我們就來了解下t-sql中配置用戶權(quán)限操作。
先看示例代碼:
1 -- 創(chuàng)建登錄名 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 -- 創(chuàng)建用戶 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 -- 查看當(dāng)前數(shù)據(jù)庫對(duì)應(yīng)的用戶 33 select USER_NAME () 34 SELECT CURRENT_USER AS ' Current User Name ' ;
這些語法都很簡單我們主需要記住就行,當(dāng)然通過SQLSERVER的可視化界面也可以配置。
下面我們也通過一個(gè)實(shí)例來理解和運(yùn)用配置用戶權(quán)限。
實(shí)例要求:
1.建立兩個(gè)用戶,user1,user2
2.user1具有操作數(shù)據(jù)庫ExamMis的所有權(quán)限
3.轉(zhuǎn)換上下文到USer1下,建立一個(gè)函數(shù):f_GetQuestionDetails,該函數(shù)返回題目內(nèi)容(包括題干,分題項(xiàng),題型三個(gè)表的關(guān)聯(lián)內(nèi)容)
4.賦權(quán)限給user2:讓其只具有執(zhí)行該函數(shù)的權(quán)限;
5.轉(zhuǎn)換上下文到user2,執(zhí)行函數(shù)調(diào)用。
1,
建立兩個(gè)用戶,user1,user2
創(chuàng)建兩個(gè)登陸名,并在為登陸名創(chuàng)建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具有操作數(shù)據(jù)庫ExamMis的所有權(quán)限
這個(gè)操作有三種方法:
1,SQLSERVER可視化操作。
2,grant all去給用戶分配權(quán)限。
3,通過SQLSERVER系統(tǒng)自帶的存儲(chǔ)過程分配權(quán)限。
這里我們先講一下grant的用法,grant是用來給用戶分配權(quán)限用的。
我們先看一個(gè)示例代碼:
1 grant all 2 on database ::ExamMis 3 to User1 4 WITH GRANT OPTION
這段代碼的意思就是給 User1分配具有操作ExamMis數(shù)據(jù)庫的一切權(quán)限。all關(guān)鍵字的意思是所有權(quán)限,也可以指定某一權(quán)限,比如查詢權(quán)限就可以寫grant select,
當(dāng)然 on 后面也可以是表,函數(shù),存儲(chǔ)過程,視圖等。
示例代碼:
1 grant select , insert , update 2 on table ::student 3 to User1 4 WITH GRANT OPTION
? 這段代碼的意思是給用戶user1在student表分配具有查詢,插入,更新的權(quán)限,但是沒有刪除得權(quán)限。
通過SQLSERVER系統(tǒng)自帶的存儲(chǔ)過程分配權(quán)限,示例代碼:
1 EXEC sp_addrolemember N ' db_owner ' , N ' User1 '
? sp_addrolemember是系統(tǒng)自帶的存儲(chǔ)過程, db_owner 的意思是所有者,可視化操作的時(shí)候我們也會(huì)看到。當(dāng)然還有一些其他的一些存儲(chǔ)過程,在文章的后面會(huì)給大家整理出來。
3, 轉(zhuǎn)換上下文到User1下,建立一個(gè)函數(shù):f_GetQuestionDetails
執(zhí)行上下面到User1下:
1 EXECUTE AS LOGIN = ' TestUser1 '
我們可以通過select USER_NAME(); 來查看當(dāng)前用戶名。
下面我們創(chuàng)建函數(shù): f_GetQuestionDetails ,函數(shù)具有返回值,返回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 );
函數(shù)的用法很簡單,就不單列去講解了,和我們編程時(shí)候用的方法類似,只是語法不同而已,大家熟悉用就行。
4,函數(shù) 賦權(quán)限給user2:讓其只具有執(zhí)行該函數(shù)的權(quán)限;
這一步我們可以直接用上面提到的grant去給用戶user2分配權(quán)限。
這里我們就多做一部,創(chuàng)建一個(gè)角色,然這個(gè)角色具有操作這個(gè)函數(shù)的權(quán)限,然后把角色分配給用戶user2。
一般我們項(xiàng)目的權(quán)限管理都是這個(gè)設(shè)計(jì):用戶->角色->權(quán)限。
示例代碼:
1 create role Select_Fuction -- 創(chuàng)建角色 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.轉(zhuǎn)換上下文到user2,執(zhí)行函數(shù)調(diào)用。
示例代碼:
1 REVERT; 2 EXECUTE AS LOGIN = ' TestUser2 ' 3 select USER_NAME () 4 5 select * from Select_Questions()
REVERT;的意思是切換上下文。
? 執(zhí)行完操作我們把登陸名,用戶名刪掉:
1 drop function Select_Questions 2 drop login TestUser1 3 drop login TestUser2 4 drop user user1 5 drop user user2
? 用戶權(quán)限配置系統(tǒng)存儲(chǔ)過程
1 sp_addlogin 登錄名,登陸密碼,默認(rèn)數(shù)據(jù)庫,默認(rèn)語言,安全碼,是否加密 2 sp_password 舊密碼,新密碼,指定登錄號(hào) 3 sp_defaultdb 指定登錄號(hào),默認(rèn)數(shù)據(jù)庫 4 sp_defaultlanguage 指定登錄號(hào),默認(rèn)語言 5 sp_helplogins 指定登錄號(hào) 6 sp_droplogin 指定登錄號(hào) 7 8 -- -----------------------數(shù)據(jù)庫用戶管理--- 9 sp_grantdbaccess 登錄號(hào),數(shù)據(jù)庫用戶名 10 sp_helpuser 數(shù)據(jù)庫用戶名 11 sp_revokedbaccess 指定數(shù)據(jù)庫用戶名 12 13 -- ----------------------服務(wù)器角色-------- 14 sp_addsrvrolermemeber 登陸賬號(hào)名,服務(wù)器角色名 15 sp_dropsrvrolermember 登陸用戶名,服務(wù)器角色名 16 17 -- ----------------------數(shù)據(jù)庫角色--------- 18 19 sp_addrole 數(shù)據(jù)庫角色名,數(shù)據(jù)庫角色的所有者 20 sp_droprole 數(shù)據(jù)庫角色名 21 22 -- ----------創(chuàng)建數(shù)據(jù)庫角色的成員---- 23 24 sp_addrolemember 數(shù)據(jù)庫角色名,數(shù)據(jù)庫用戶 25 sp_droprolemember 數(shù)據(jù)庫角色名,數(shù)據(jù)庫用戶
t-sql中的用戶權(quán)限配置就講到這,這一部分的內(nèi)容我們很少去涉及,但是還是了解一些,說不準(zhǔn)哪天DB不在,經(jīng)理讓你去配數(shù)據(jù)庫用戶呢,編程的都不會(huì),就你會(huì),自己是不是很有面子啊。哈哈。
以后繼續(xù)整理一下編程相關(guān)的知識(shí),請(qǐng)大家多多關(guān)注。。。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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