sql server 2005用戶權(quán)限設(shè)置深入分析
用戶的權(quán)限分為3類:
l 登錄的權(quán)限;
l 訪問特定數(shù)據(jù)庫的權(quán)限;
l 在數(shù)據(jù)庫中具體的對(duì)象上執(zhí)行特定操作的權(quán)限。
既然我們已經(jīng)看過了創(chuàng)建登錄賬戶,這里將把重點(diǎn)放在登錄賬戶能夠擁有的特定權(quán)限上。
22.3.1 授予訪問特定數(shù)據(jù)庫的權(quán)限
如果想要一個(gè)用戶可以訪問數(shù)據(jù)庫,你需要做的第一件事情是授予用戶訪問那個(gè)數(shù)據(jù)庫的權(quán)限??梢栽贛anagement Studio中,通過把用戶加入到服務(wù)器的數(shù)據(jù)庫結(jié)點(diǎn)的用戶成員中來實(shí)現(xiàn)。如果要用T-SQL來添加用戶,需要使用CREATE USER或遺留的存儲(chǔ)過程sp_grantdbaccess。
注意,當(dāng)你在數(shù)據(jù)庫中CREATE一個(gè)用戶時(shí),實(shí)際上,那些許可權(quán)限被存儲(chǔ)在數(shù)據(jù)庫中,并映射到那個(gè)用戶的服務(wù)器標(biāo)識(shí)符上。當(dāng)還原數(shù)據(jù)庫時(shí),可能不得不在還原數(shù)據(jù)庫的地方,重新把用戶權(quán)限映射到服務(wù)器標(biāo)識(shí)符。
1.CREATE USER
CREATE USER命令把新用戶添加到數(shù)據(jù)庫中。用戶可以源自現(xiàn)有的登錄名、證書或非對(duì)稱密鑰,用戶也可以是只能在當(dāng)前數(shù)據(jù)庫中的本地用戶。其語法如下:
CREATE USER <用戶名>
[ { { FOR | FROM }
{
LOGIN <登錄名>
| CERTIFICATE <證書名>
| ASYMMETRIC KEY <密鑰名>
}
| WITHOUT LOGIN ]
[ WITH DEFAULT_SCHEMA = <模式名> ]
對(duì)于這些元素,我們概略看一下其中一些元素的含義是什么:
選 項(xiàng)
說 明
LOGIN
想要授予訪問當(dāng)前數(shù)據(jù)庫的權(quán)限的登錄名
CERTIFICATE
與用戶關(guān)聯(lián)的證書的邏輯名稱。注意,必須已經(jīng)使用CREATE CERTIFICATE命令創(chuàng)建了證書
ASYMMETRIC KEY
與用戶關(guān)聯(lián)的非對(duì)稱密鑰的邏輯名稱。注意,必須已經(jīng)使用CREATE ASYMMETRIC KEY命令創(chuàng)建了密鑰
WITHOUT LOGIN
創(chuàng)建只能在當(dāng)前數(shù)據(jù)庫中活動(dòng)的用戶??梢杂盟鼇斫⑻囟ǖ陌踩舷挛模?,該用戶不能映射到當(dāng)前數(shù)據(jù)庫之外的登錄名,也不能訪問任何其他的數(shù)據(jù)庫
WITH DEFAULT_SCHEMA
設(shè)立不是默認(rèn)的“dbo”的模式,以作為當(dāng)前用戶的默認(rèn)模式
2.sp_grantdbaccess
這是遺留的方法,用來授予登錄名到特定數(shù)據(jù)庫的訪問權(quán)限。其語法如下:
sp_grantdbaccess [@loginame =] <'登錄名'>[, [@name_in_db =] <'數(shù)據(jù)庫中的別名'>
注意,授予的是當(dāng)前數(shù)據(jù)庫的訪問權(quán)限——即是說,你 必須確保想要用戶能夠訪問的數(shù)據(jù)庫是發(fā)出該命令時(shí)的當(dāng)前數(shù)據(jù)庫。登錄名是用來登錄到SQL Server中的實(shí)際的登錄ID。參數(shù)name_in_db允許給該用戶另外的識(shí)別名稱。這個(gè)別名只適用于此處的數(shù)據(jù)庫——其他所有的數(shù)據(jù)庫仍將使用該登 錄ID的默認(rèn)名稱,或者使用在授予用戶那個(gè)數(shù)據(jù)庫的訪問權(quán)限時(shí)所定義的別名。定義別名將影響身份識(shí)別函數(shù),如USER_NAME()。系統(tǒng)級(jí)別的函數(shù)(如 SYSTEM_USER)將返回基礎(chǔ)的登錄ID。
22.3.2 授予數(shù)據(jù)庫中對(duì)象的權(quán)限
好吧,用戶擁有了登錄名,并且,能夠訪問你想要他或她可以訪問的數(shù)據(jù)庫,那么,是否現(xiàn)在就萬事大吉了呢?如果事情真有那么簡單就好了!現(xiàn)在當(dāng)然還沒有一切就緒。
在用戶能夠訪問什么的問題上,SQL Server給了我們級(jí)別相當(dāng)精細(xì)的控制。多數(shù)時(shí)候,一些信息是希望用戶能夠訪問到的,但是,數(shù)據(jù)庫中也有另一些信息是不希望用戶訪問的。例如,你可能想 要客戶服務(wù)人員能夠查看和維護(hù)訂單信息,但是可能不希望他們亂看工資信息?;蛟S,反之亦然——你需要人力資源人員能夠編輯雇員記錄,但是,或許不想要他們 在交易上給某人很大的折扣。
SQL Server允許你給SQL Server中一些不同的對(duì)象指派一組不同的權(quán)限。能夠?yàn)槠渲概蓹?quán)限的對(duì)象包括表、視圖和存儲(chǔ)過程。觸發(fā)器隱含具有創(chuàng)建它們的人的權(quán)限。
對(duì)象上的用戶權(quán)限分為6種不同的類型。
用戶權(quán)限
說 明
SELECT
允許用戶“看到”數(shù)據(jù)。如果用戶擁有該權(quán)限,則用戶能夠在其被授予權(quán)限的表或視圖上運(yùn)行SELECT語句
INSERT
允許用戶創(chuàng)建新的數(shù)據(jù)。具有這種權(quán)限的用戶能夠運(yùn)行INSERT語句。注意,與許多系統(tǒng)不同,具有INSERT能力并不一定意味著擁有SELECT權(quán)限
UPDATE
允許用戶修改已有的數(shù)據(jù)。具有這種權(quán)限的用戶能夠運(yùn)行UPDATE語句。類似于INSERT語句,具有UPDATE能力并不一定意味著擁有SELECT權(quán)限。
DELETE
允許用戶刪除數(shù)據(jù)。具有這種權(quán)限的用戶能夠運(yùn)行DELETE語句。同樣,具有DELETE能力不一定意味著擁有SELECT權(quán)限
REFERENCES
在要插入行的表中有引用另一個(gè)表的外鍵約束,而用戶在那個(gè)表上沒有SELECT權(quán)限,REFERENCES權(quán)限允許用戶插入行
EXECUTE
允許用戶EXECUTE指定的存儲(chǔ)過程
在你正在把權(quán)限指定到其上的特定的表、視圖或存儲(chǔ)過程中,可以在需要時(shí)混合搭配這些權(quán)限。
可以在Management Studio中指派這些權(quán)限,你只需導(dǎo)航到服務(wù)器的“安全性”結(jié)點(diǎn)的“登錄名”選項(xiàng)上。在用戶上右擊,并選擇“屬性”。根據(jù)你是在數(shù)據(jù)庫中還是在安全性結(jié) 點(diǎn)中,打開的對(duì)話框?qū)⒂兴煌?,無論哪一種情況,都能夠得到設(shè)置權(quán)限的選項(xiàng)。使用T-SQL指派權(quán)限會(huì)使用三個(gè)命令,了解這三個(gè)命令是有益的,即使 你只準(zhǔn)備通過Management Studio來指派權(quán)限(術(shù)語是相同的)。
1.GRANT
GRANT把對(duì)象上指定的訪問權(quán)限給予指定的用戶或角色,對(duì)象是GRANT語句的主體。
GRANT語句的語法如下所示:
GRANT
ALL [PRIVILEGES] | <權(quán)限>[,...n]
ON
<表名或視圖名>[(<列名>[,...n])]
|<存儲(chǔ)過程或擴(kuò)展存儲(chǔ)過程名>
TO <登錄ID或角色名>[,...n]
[WITH GRANT OPTION]
[AS <角色名>]
ALL關(guān)鍵字表示你想要授予的是適用于那個(gè)對(duì)象類型的所有權(quán)限(EXECUTE絕不適用于表)。如果不使用ALL關(guān)鍵字,則需要提供一個(gè)或多個(gè)具體的權(quán)限,這些具體的權(quán)限是針對(duì)那個(gè)對(duì)象想要授予的。
PRIVILEGES是一個(gè)新的關(guān)鍵字,它除了提供ANSI-92兼容性外沒有實(shí)際的功能。
ON關(guān)鍵字用作一個(gè)占位符,以說明接下來的是想要授予其權(quán)限的對(duì)象。注意,如果你是在表上授予權(quán)限,可以通過明確說明受影響的列的列表來指定下至列級(jí)的權(quán)限——如果不提供具體的列,則認(rèn)為將影響所有的列。
在對(duì)列級(jí)權(quán)限的看法 上,微軟似乎做的是些表面的事情。能夠說一個(gè)用戶可以在特定的表上進(jìn)行SELECT,但僅限于在該表中特定的列上進(jìn)行SELECT,這似乎很酷,然而,在 列級(jí)權(quán)限的使用中以及微軟為實(shí)現(xiàn)列級(jí)權(quán)限所做的工作中,確實(shí)讓安全性處理太過錯(cuò)綜復(fù)雜了。鑒于此,近來關(guān)于該主題的文獻(xiàn),以及我從內(nèi)部人士那里得到的消 息,似乎都表明微軟想要丟棄列級(jí)安全性了。在使用上他們建議——如果需要限制用戶只能看到特定的列,請(qǐng)改為考慮使用視圖。
TO語句所做的事情正如你期望的那樣——它指定想要把該訪問權(quán)限授予誰。被授予權(quán)限的可以是登錄ID或角色名。
WITH GRANT OPTION允許你向其授予訪問權(quán)限的用戶也能向其他用戶授予訪問權(quán)限。
由于使用該選項(xiàng) 后,要了解誰獲得了訪問什么的權(quán)限,將很快變得十分痛苦,因此,我建議避免使用該選項(xiàng)。當(dāng)然,你總是可以進(jìn)入到Management Studio中來查看對(duì)象上的權(quán)限,但那是被動(dòng)反應(yīng)的方式而非積極主動(dòng)的方式——你是在查找當(dāng)前訪問級(jí)別上哪里出錯(cuò)了,而不是事先停止不希望發(fā)生的訪問。
最后,但并非最不重要的,是AS關(guān)鍵字。該關(guān)鍵字處理的是一個(gè)登錄名屬于多個(gè)角色的問題。
接下來,我們來看一、兩個(gè)例子。后面將看到,我們已 經(jīng)創(chuàng)建的TestAccount賬戶,基于其是Public角色(所有的數(shù)據(jù)庫用戶都屬于的東西,并且,無法從中移除)中的成員而擁有了一些訪問權(quán)限。然 而,尚有大量的項(xiàng)目是TestAccount不具有訪問權(quán)限的(由于Public是TestAccount唯一屬于的角色,因此,Public也不具有那 些權(quán)限)。
先從以TestAccount用戶登錄開始。然后在Region表上嘗試一個(gè)SELECT語句:
很快,你將收到來自SQL Server的消息,告知:你正在嘗試去到你所不應(yīng)該訪問的地方。
單獨(dú)以sa登錄——如果你愿意,也可以在同一個(gè)查詢編輯器實(shí)例中,通過選擇菜單“文件”→“連接”,來完成這件事情。然后,為新的連接選擇“SQL Server身份驗(yàn)證”,并用正確的密碼以sa身份登錄?,F(xiàn)在,執(zhí)行GRANT語句:
接著,切換回TestAccount連接(要記住,以什么用戶進(jìn)行連接的信息顯示在連接窗口的標(biāo)題欄中),然后,再嘗試執(zhí)行SELECT語句:這一次,得到了好得多的結(jié)果:
我們繼續(xù)嘗試另外的語句。這一次,我們?cè)贓mployeeTerritories表上運(yùn)行相同的測試和命令:
該語句執(zhí)行失敗——這同樣是由于你不具備相應(yīng)的權(quán)限所致,因此,授予用戶該表上的權(quán)限:
然后,再次運(yùn)行SELECT語句,一切進(jìn)展順利:
不過,若要再添加一點(diǎn)變化,嘗試在這個(gè)表中執(zhí)行INSERT:
SQL Server立即會(huì)讓我們走開——我們不具備必要的權(quán)限,因此,授予用戶相應(yīng)的權(quán)限(使用sa連接):
現(xiàn)在,再次運(yùn)行INSERT語句:
一切進(jìn)展順利。
2.DENY
DENY明確阻止用戶獲得目標(biāo)對(duì)象上指定的訪問 權(quán)限。DENY的關(guān)鍵所在是,它將覆蓋任何GRANT語句。由于用戶可以屬于多個(gè)角色(馬上將對(duì)此進(jìn)行討論),因此,一個(gè)用戶可能屬于被授予了訪問權(quán)限的 角色,但同時(shí)又受DENY的影響。如果用戶個(gè)人的權(quán)限和基于角色成員身份所獲得的權(quán)限混合在一起,DENY和GRANT同時(shí)存在于其中,那么DENY總是 優(yōu)先的。簡言之,如果用戶或用戶所屬的任何角色在權(quán)限問題上有DENY出現(xiàn),則用戶將不能使用在那個(gè)對(duì)象上的訪問權(quán)限。
其語法很復(fù)雜繁多,看上去與GRANT語句一樣:
DENY
ALL [PRIVILEGES]|<權(quán)限>[,...n]
ON
<表名或視圖名>[(列名[,...n])]
|<存儲(chǔ)過程或擴(kuò)展存儲(chǔ)過程名>
TO <登錄ID或角色名>[,...n]
[CASCADE]
同樣,ALL關(guān)鍵字表明,想要拒絕授予該對(duì)象類型上所有可用的權(quán)限(EXECUTE絕不適用于表)。如果不使用ALL關(guān)鍵字,則需要提供一個(gè)或多個(gè)具體的權(quán)限,這些具體的權(quán)限是針對(duì)想要拒絕授予權(quán)限的對(duì)象的。
PRIVILEGES依然是新關(guān)鍵字,并且,除了提供ANSI-92兼容性外沒有任何實(shí)際的功能。
ON關(guān)鍵字用作一個(gè)占位符,以說明接下來的是想要拒絕授予其權(quán)限的對(duì)象。
到此為止,所有的事情都與GRANT語句幾乎一樣。 CASCADE關(guān)鍵字與GRANT語句中的WITH GRANT OPTION相對(duì)應(yīng)。CASCADE告訴SQL Server,如果用戶在WITH GRANT OPTION規(guī)則下授予了其他人訪問權(quán)限,則對(duì)于所有這些人,也拒絕他們的訪問。
為了在DENY上運(yùn)行一個(gè)例子,我們使用TestAccount登錄名嘗試執(zhí)行一個(gè)簡單的SELECT語句:
運(yùn)行該語句后,將返回大約9條記錄。在我們不曾授予TestAccount該權(quán)限時(shí),它是如何獲得訪問權(quán)限的呢?原因是,TestAccount屬于Public,而Public被授予了Employees上的訪問權(quán)限。
假如我們不希望TestAccount能夠訪問Employees。無論什么原因,TestAccount是一個(gè)例外,并且我們不希望該用戶查看那些數(shù)據(jù)——我們只需發(fā)出DENY語句(記住要使用sa登錄名來運(yùn)行DENY):
當(dāng)再次用TestAccount登錄名運(yùn)行SELECT語句時(shí),將得到一個(gè)錯(cuò)誤——你不再能夠訪問。此外還要注意,由于我們使用了ALL關(guān)鍵字,因此,也拒絕將Public所擁有的INSERT、DELETE和UPDATE訪問權(quán)限授予TestAccount。
注意,DENY是SQL Server 7.0中新增的語句。在6.5版本中有拒絕授予權(quán)限的概念,但是,其實(shí)現(xiàn)方式是不同的。在6.5版中,不是使用DENY,而是發(fā)出兩次REVOKE語句。新的DENY關(guān)鍵字讓事情更加清晰明了。
3.REVOKE
REVOKE將消除以前發(fā)出的GRANT或DENY語句的影響??梢园言撜Z句想成是有針對(duì)性的“撤銷”語句。
REVOKE的語法混合了GRANT和DENY語句:
REVOKE [GRANT OPTION FOR]
ALL [PRIVILEGES] | <權(quán)限>[,...n]
ON
<表名或視圖名>[(列名 [,...n])]
|<存儲(chǔ)過程或擴(kuò)展存儲(chǔ)過程名>
TO | FROM <登錄ID或角色名>[,...n]
[CASCADE]
[AS <角色名>]
實(shí)際上,這里要做的說明與對(duì)GRANT和DENY語句的說明相同——然而,我將在這里再次講述,以免你為了快速查找有關(guān)REVOKE的說明而向前翻閱本書。
同樣,ALL關(guān)鍵字表明,想要撤銷在該對(duì)象類型上所有可用的權(quán)限。如果不使用ALL關(guān)鍵字,則需要提供一個(gè)或多個(gè)具體的權(quán)限,這些具體的權(quán)限是針對(duì)那個(gè)對(duì)象想要撤銷的權(quán)限。
PRIVILEGES除了提供ANSI-92兼容性外,依然沒有任何實(shí)際的作用。
ON關(guān)鍵字用作一個(gè)占位符,以說明接下來的是想要撤銷其權(quán)限的對(duì)象。
CASCADE關(guān)鍵字與GRANT語句中的WITH GRANT OPTION相對(duì)應(yīng)。CASCADE告訴SQL Server,如果用戶在WITH GRANT OPTION規(guī)則下授予了其他人訪問權(quán)限,則對(duì)于所有這些被授予權(quán)限的人,也將撤銷他們的訪問權(quán)限。
同樣,AS關(guān)鍵字只是用來說明想要基于哪個(gè)角色發(fā)出這一命令。
我們使用sa連接,撤銷授予的到NorthwindSecure中的Region表的訪問權(quán)限。
執(zhí)行完該語句后,TestAccount將不能再在Region表上運(yùn)行SELECT語句。
為了撤銷DENY,我們同樣也發(fā)出一個(gè)REVOKE語句。這一次,將重新獲得到Employees表的訪問權(quán)限:
現(xiàn)在,我們已經(jīng)了解所有這些命令是如何針對(duì)單個(gè)用戶來控制訪問權(quán)限的,接下來,看這樣一種方法,該方法通過分組管理來極大簡化對(duì)這些權(quán)限的管理。
22.3.3 用戶權(quán)限和語句級(jí)別的許可
用戶許可權(quán)限并不僅僅局限于數(shù)據(jù)庫中的對(duì)象上——它們也能擴(kuò)展到某些其他的語句,這些語句不直接與任何特定的對(duì)象束縛在一起。SQL Server允許你對(duì)運(yùn)行幾種不同的語句的許可權(quán)限進(jìn)行控制,這些語句包括:
l CREATE DATABASE;
l CREATE DEFAULT;
l CREATE PROCEDURE;
l CREATE RULE;
l CREATE TABLE;
l CREATE VIEW;
l BACKUP DATABASE;
l BACKUP LOG。
到現(xiàn)在為止,除了兩個(gè)備份命令外,其他所有的這些命令我們都已經(jīng)在操作中見過了。(備份命令要做什么是不言自明的,因此,眼下不準(zhǔn)備在這上面花費(fèi)時(shí)間,我們將在第24章中討論它們——只需記住,它們是你能夠在語句級(jí)別進(jìn)行控制的東西。)
那么,我們?nèi)绾沃概蛇@些許可權(quán)限呢?實(shí)際上,現(xiàn)在你 已經(jīng)見過GRANT、REVOKE和DENY針對(duì)對(duì)象的運(yùn)作,那么,在語句級(jí)別的許可權(quán)限上你也已經(jīng)有了相當(dāng)?shù)牧私?。從語法構(gòu)成上說,它們與對(duì)象級(jí)別的許 可權(quán)限基本相同,除了它們更加簡單(你不必填入那樣多的東西)。其語法如下:
GRANT <ALL | 語句[,...n]> TO <登錄 ID>[,...n]
很簡單吧?接下來,通過驗(yàn)證我們的測試用戶尚沒有權(quán)力執(zhí)行CREATE,以進(jìn)行一次快速的試驗(yàn)。確保以TestAccount登錄,然后,運(yùn)行下面的命令(在下面的語句中,不要忘記把ARISTOTLE轉(zhuǎn)換到你的域名):
我們運(yùn)行上面的命令是完全行不通的:
現(xiàn)在,使用sa賬戶(或者其他具有NorthwindSecure的dbo權(quán)力的賬戶)登錄到SQL Server中。然后,運(yùn)行命令以授予許可權(quán)限:
你會(huì)得到命令成功執(zhí)行的確認(rèn)消息。然后,再次嘗試運(yùn)行CREATE語句(記住使用TestAccount登錄):
這一次一切順利。
在對(duì)象級(jí)別的許可權(quán)限上,DENY和REVOKE也以同樣的方式工作。
相關(guān)文章
安裝SQL2005時(shí)出現(xiàn)的版本變更檢查SKUUPGRADE=1問題的解決方法
這篇文章主要介紹了安裝SQL2005時(shí)出現(xiàn)的版本變更檢查SKUUPGRADE=1問題的解決方法,需要的朋友可以參考下2015-01-01分頁存儲(chǔ)過程(一)使用sql2005的新函數(shù)構(gòu)造分頁存儲(chǔ)過程
分頁存儲(chǔ)過程一直是很多人經(jīng)常用到的東西,怎么樣才能設(shè)計(jì)一個(gè)既實(shí)用,又強(qiáng)大,還可以解決大數(shù)據(jù)量的分頁存儲(chǔ)過程呢?2010-05-05SQL Server 2005 中使用 Try Catch 處理異常
本文主要對(duì)比了Sql Server 2000和Sql Server 2005對(duì)異常處理的方法,Sql Server 2005 之后的TRY CATCH捕捉異常,更類似C#、JAVA等語言,更容易被程序員理解。2016-05-05SQL Server Management Studio Express管理器 沒有導(dǎo)入導(dǎo)出數(shù)據(jù)的向?qū)У慕鉀Q方法
我的SQL2005 Microsoft SQL Server Management Studio Express管理器里,右鍵單擊一個(gè)數(shù)據(jù)庫,指向“任務(wù)”,再單擊“導(dǎo)入數(shù)據(jù)”或“導(dǎo)出數(shù)據(jù)”中沒有這個(gè)選項(xiàng),要想實(shí)現(xiàn)導(dǎo)入/導(dǎo)出數(shù)據(jù),要怎么辦呢?2011-04-04SQL2005CLR函數(shù)擴(kuò)展 - 關(guān)于山寨索引
對(duì)于文件索引lucene才是權(quán)威,這里只是自己實(shí)現(xiàn)了一個(gè)可以實(shí)現(xiàn)簡單文件索引的半成品.所謂文件索引就是把sql字符串按字節(jié)分詞保存到磁盤文件目錄結(jié)構(gòu)中用來快速定位2013-06-06Microsoft Sql server2005的安裝步驟圖文詳解及常見問題解決方案
這篇文章主要介紹了Microsoft Sql server2005的安裝步驟圖文詳解及常見問題解決方案的相關(guān)資料,需要的朋友可以參考下2016-05-05SQL Server中的XML數(shù)據(jù)進(jìn)行insert、update、delete
SQL Server 2005/2008增加了對(duì)XML數(shù)據(jù)的支持,同時(shí)也新增了幾種操作XML的方法,本文主要以SQL Server 2008為例介紹如何對(duì)XML數(shù)據(jù)進(jìn)行insert、update、delete。2009-07-07在sqlserver2005中安裝sql server 2000的示例數(shù)據(jù)庫northwind的方法
裝完sql server 2005后卻沒有找到ms的示例數(shù)據(jù)庫northwind 后來查看安裝光盤發(fā)現(xiàn)sql server 2005種只有adventurework與adventureworkDW這兩個(gè)sample database 到ms官方站找了好久 才找到sql server 2000的sample database2013-05-05