主頁 > 知識庫 > sql server 2005用戶權(quán)限設(shè)置深入分析

sql server 2005用戶權(quán)限設(shè)置深入分析

熱門標(biāo)簽:AI電銷 網(wǎng)站排名優(yōu)化 百度競價排名 地方門戶網(wǎng)站 Linux服務(wù)器 呼叫中心市場需求 鐵路電話系統(tǒng) 服務(wù)外包
關(guān)于什么是用戶權(quán)限,最簡單的定義可能是,“用戶能做什么和不能做什么?!痹谶@里,簡單的定義就相當(dāng)不錯了。
用戶的權(quán)限分為3類
l 登錄的權(quán)限;
l 訪問特定數(shù)據(jù)庫的權(quán)限;
l 在數(shù)據(jù)庫中具體的對象上執(zhí)行特定操作的權(quán)限。
既然我們已經(jīng)看過了創(chuàng)建登錄賬戶,這里將把重點(diǎn)放在登錄賬戶能夠擁有的特定權(quán)限上。
22.3.1 授予訪問特定數(shù)據(jù)庫的權(quán)限
如果想要一個用戶可以訪問數(shù)據(jù)庫,你需要做的第一件事情是授予用戶訪問那個數(shù)據(jù)庫的權(quán)限??梢栽贛anagement Studio中,通過把用戶加入到服務(wù)器的數(shù)據(jù)庫結(jié)點(diǎn)的用戶成員中來實(shí)現(xiàn)。如果要用T-SQL來添加用戶,需要使用CREATE USER或遺留的存儲過程sp_grantdbaccess。
注意,當(dāng)你在數(shù)據(jù)庫中CREATE一個用戶時,實(shí)際上,那些許可權(quán)限被存儲在數(shù)據(jù)庫中,并映射到那個用戶的服務(wù)器標(biāo)識符上。當(dāng)還原數(shù)據(jù)庫時,可能不得不在還原數(shù)據(jù)庫的地方,重新把用戶權(quán)限映射到服務(wù)器標(biāo)識符。
1.CREATE USER
CREATE USER命令把新用戶添加到數(shù)據(jù)庫中。用戶可以源自現(xiàn)有的登錄名、證書或非對稱密鑰,用戶也可以是只能在當(dāng)前數(shù)據(jù)庫中的本地用戶。其語法如下:
CREATE USER 用戶名>
[ { { FOR | FROM }
{
LOGIN 登錄名>
| CERTIFICATE 證書名>
| ASYMMETRIC KEY 密鑰名>
}
| WITHOUT LOGIN ]
[ WITH DEFAULT_SCHEMA = 模式名> ]
對于這些元素,我們概略看一下其中一些元素的含義是什么:
選  項(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)的非對稱密鑰的邏輯名稱。注意,必須已經(jīng)使用CREATE ASYMMETRIC KEY命令創(chuàng)建了密鑰
WITHOUT LOGIN
創(chuàng)建只能在當(dāng)前數(shù)據(jù)庫中活動的用戶??梢杂盟鼇斫⑻囟ǖ陌踩舷挛?,但是,該用戶不能映射到當(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ā)出該命令時的當(dāng)前數(shù)據(jù)庫。登錄名是用來登錄到SQL Server中的實(shí)際的登錄ID。參數(shù)name_in_db允許給該用戶另外的識別名稱。這個別名只適用于此處的數(shù)據(jù)庫——其他所有的數(shù)據(jù)庫仍將使用該登 錄ID的默認(rèn)名稱,或者使用在授予用戶那個數(shù)據(jù)庫的訪問權(quán)限時所定義的別名。定義別名將影響身份識別函數(shù),如USER_NAME()。系統(tǒng)級別的函數(shù)(如 SYSTEM_USER)將返回基礎(chǔ)的登錄ID。
22.3.2 授予數(shù)據(jù)庫中對象的權(quán)限
好吧,用戶擁有了登錄名,并且,能夠訪問你想要他或她可以訪問的數(shù)據(jù)庫,那么,是否現(xiàn)在就萬事大吉了呢?如果事情真有那么簡單就好了!現(xiàn)在當(dāng)然還沒有一切就緒。
在用戶能夠訪問什么的問題上,SQL Server給了我們級別相當(dāng)精細(xì)的控制。多數(shù)時候,一些信息是希望用戶能夠訪問到的,但是,數(shù)據(jù)庫中也有另一些信息是不希望用戶訪問的。例如,你可能想 要客戶服務(wù)人員能夠查看和維護(hù)訂單信息,但是可能不希望他們亂看工資信息?;蛟S,反之亦然——你需要人力資源人員能夠編輯雇員記錄,但是,或許不想要他們 在交易上給某人很大的折扣。
SQL Server允許你給SQL Server中一些不同的對象指派一組不同的權(quán)限。能夠?yàn)槠渲概蓹?quán)限的對象包括表、視圖和存儲過程。觸發(fā)器隱含具有創(chuàng)建它們的人的權(quán)限。
對象上的用戶權(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
在要插入行的表中有引用另一個表的外鍵約束,而用戶在那個表上沒有SELECT權(quán)限,REFERENCES權(quán)限允許用戶插入行
EXECUTE
允許用戶EXECUTE指定的存儲過程
在你正在把權(quán)限指定到其上的特定的表、視圖或存儲過程中,可以在需要時混合搭配這些權(quán)限。
可以在Management Studio中指派這些權(quán)限,你只需導(dǎo)航到服務(wù)器的“安全性”結(jié)點(diǎn)的“登錄名”選項(xiàng)上。在用戶上右擊,并選擇“屬性”。根據(jù)你是在數(shù)據(jù)庫中還是在安全性結(jié) 點(diǎn)中,打開的對話框?qū)⒂兴煌?,無論哪一種情況,都能夠得到設(shè)置權(quán)限的選項(xiàng)。使用T-SQL指派權(quán)限會使用三個命令,了解這三個命令是有益的,即使 你只準(zhǔn)備通過Management Studio來指派權(quán)限(術(shù)語是相同的)。
1.GRANT
GRANT把對象上指定的訪問權(quán)限給予指定的用戶或角色,對象是GRANT語句的主體。
GRANT語句的語法如下所示:
GRANT
ALL [PRIVILEGES] | 權(quán)限>[,...n]
ON
表名或視圖名>[(列名>[,...n])]
|存儲過程或擴(kuò)展存儲過程名>
TO 登錄ID或角色名>[,...n]
[WITH GRANT OPTION]
[AS 角色名>]
ALL關(guān)鍵字表示你想要授予的是適用于那個對象類型的所有權(quán)限(EXECUTE絕不適用于表)。如果不使用ALL關(guān)鍵字,則需要提供一個或多個具體的權(quán)限,這些具體的權(quán)限是針對那個對象想要授予的。
PRIVILEGES是一個新的關(guān)鍵字,它除了提供ANSI-92兼容性外沒有實(shí)際的功能。
ON關(guān)鍵字用作一個占位符,以說明接下來的是想要授予其權(quán)限的對象。注意,如果你是在表上授予權(quán)限,可以通過明確說明受影響的列的列表來指定下至列級的權(quán)限——如果不提供具體的列,則認(rèn)為將影響所有的列。
在對列級權(quán)限的看法 上,微軟似乎做的是些表面的事情。能夠說一個用戶可以在特定的表上進(jìn)行SELECT,但僅限于在該表中特定的列上進(jìn)行SELECT,這似乎很酷,然而,在 列級權(quán)限的使用中以及微軟為實(shí)現(xiàn)列級權(quán)限所做的工作中,確實(shí)讓安全性處理太過錯綜復(fù)雜了。鑒于此,近來關(guān)于該主題的文獻(xiàn),以及我從內(nèi)部人士那里得到的消 息,似乎都表明微軟想要丟棄列級安全性了。在使用上他們建議——如果需要限制用戶只能看到特定的列,請改為考慮使用視圖。
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中來查看對象上的權(quán)限,但那是被動反應(yīng)的方式而非積極主動的方式——你是在查找當(dāng)前訪問級別上哪里出錯了,而不是事先停止不希望發(fā)生的訪問。
最后,但并非最不重要的,是AS關(guān)鍵字。該關(guān)鍵字處理的是一個登錄名屬于多個角色的問題。
接下來,我們來看一、兩個例子。后面將看到,我們已 經(jīng)創(chuàng)建的TestAccount賬戶,基于其是Public角色(所有的數(shù)據(jù)庫用戶都屬于的東西,并且,無法從中移除)中的成員而擁有了一些訪問權(quán)限。然 而,尚有大量的項(xiàng)目是TestAccount不具有訪問權(quán)限的(由于Public是TestAccount唯一屬于的角色,因此,Public也不具有那 些權(quán)限)。
先從以TestAccount用戶登錄開始。然后在Region表上嘗試一個SELECT語句:
很快,你將收到來自SQL Server的消息,告知:你正在嘗試去到你所不應(yīng)該訪問的地方。
單獨(dú)以sa登錄——如果你愿意,也可以在同一個查詢編輯器實(shí)例中,通過選擇菜單“文件”→“連接”,來完成這件事情。然后,為新的連接選擇“SQL Server身份驗(yàn)證”,并用正確的密碼以sa身份登錄?,F(xiàn)在,執(zhí)行GRANT語句:
接著,切換回TestAccount連接(要記住,以什么用戶進(jìn)行連接的信息顯示在連接窗口的標(biāo)題欄中),然后,再嘗試執(zhí)行SELECT語句:這一次,得到了好得多的結(jié)果:
我們繼續(xù)嘗試另外的語句。這一次,我們在EmployeeTerritories表上運(yùn)行相同的測試和命令:
該語句執(zhí)行失敗——這同樣是由于你不具備相應(yīng)的權(quán)限所致,因此,授予用戶該表上的權(quán)限:
然后,再次運(yùn)行SELECT語句,一切進(jìn)展順利:
不過,若要再添加一點(diǎn)變化,嘗試在這個表中執(zhí)行INSERT:
SQL Server立即會讓我們走開——我們不具備必要的權(quán)限,因此,授予用戶相應(yīng)的權(quán)限(使用sa連接):
現(xiàn)在,再次運(yùn)行INSERT語句:
一切進(jìn)展順利。
2.DENY
DENY明確阻止用戶獲得目標(biāo)對象上指定的訪問 權(quán)限。DENY的關(guān)鍵所在是,它將覆蓋任何GRANT語句。由于用戶可以屬于多個角色(馬上將對此進(jìn)行討論),因此,一個用戶可能屬于被授予了訪問權(quán)限的 角色,但同時又受DENY的影響。如果用戶個人的權(quán)限和基于角色成員身份所獲得的權(quán)限混合在一起,DENY和GRANT同時存在于其中,那么DENY總是 優(yōu)先的。簡言之,如果用戶或用戶所屬的任何角色在權(quán)限問題上有DENY出現(xiàn),則用戶將不能使用在那個對象上的訪問權(quán)限。
其語法很復(fù)雜繁多,看上去與GRANT語句一樣:
DENY
ALL [PRIVILEGES]|權(quán)限>[,...n]
ON
表名或視圖名>[(列名[,...n])]
|存儲過程或擴(kuò)展存儲過程名>
TO 登錄ID或角色名>[,...n]
[CASCADE]
同樣,ALL關(guān)鍵字表明,想要拒絕授予該對象類型上所有可用的權(quán)限(EXECUTE絕不適用于表)。如果不使用ALL關(guān)鍵字,則需要提供一個或多個具體的權(quán)限,這些具體的權(quán)限是針對想要拒絕授予權(quán)限的對象的。
PRIVILEGES依然是新關(guān)鍵字,并且,除了提供ANSI-92兼容性外沒有任何實(shí)際的功能。
ON關(guān)鍵字用作一個占位符,以說明接下來的是想要拒絕授予其權(quán)限的對象。
到此為止,所有的事情都與GRANT語句幾乎一樣。 CASCADE關(guān)鍵字與GRANT語句中的WITH GRANT OPTION相對應(yīng)。CASCADE告訴SQL Server,如果用戶在WITH GRANT OPTION規(guī)則下授予了其他人訪問權(quán)限,則對于所有這些人,也拒絕他們的訪問。
為了在DENY上運(yùn)行一個例子,我們使用TestAccount登錄名嘗試執(zhí)行一個簡單的SELECT語句:
運(yùn)行該語句后,將返回大約9條記錄。在我們不曾授予TestAccount該權(quán)限時,它是如何獲得訪問權(quán)限的呢?原因是,TestAccount屬于Public,而Public被授予了Employees上的訪問權(quán)限。
假如我們不希望TestAccount能夠訪問Employees。無論什么原因,TestAccount是一個例外,并且我們不希望該用戶查看那些數(shù)據(jù)——我們只需發(fā)出DENY語句(記住要使用sa登錄名來運(yùn)行DENY):
當(dāng)再次用TestAccount登錄名運(yùn)行SELECT語句時,將得到一個錯誤——你不再能夠訪問。此外還要注意,由于我們使用了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句想成是有針對性的“撤銷”語句。
REVOKE的語法混合了GRANT和DENY語句:
REVOKE [GRANT OPTION FOR]
ALL [PRIVILEGES] | 權(quán)限>[,...n]
ON
表名或視圖名>[(列名 [,...n])]
|存儲過程或擴(kuò)展存儲過程名>
TO | FROM 登錄ID或角色名>[,...n]
[CASCADE]
[AS 角色名>]
實(shí)際上,這里要做的說明與對GRANT和DENY語句的說明相同——然而,我將在這里再次講述,以免你為了快速查找有關(guān)REVOKE的說明而向前翻閱本書。
同樣,ALL關(guān)鍵字表明,想要撤銷在該對象類型上所有可用的權(quán)限。如果不使用ALL關(guān)鍵字,則需要提供一個或多個具體的權(quán)限,這些具體的權(quán)限是針對那個對象想要撤銷的權(quán)限。
PRIVILEGES除了提供ANSI-92兼容性外,依然沒有任何實(shí)際的作用。
ON關(guān)鍵字用作一個占位符,以說明接下來的是想要撤銷其權(quán)限的對象。
CASCADE關(guān)鍵字與GRANT語句中的WITH GRANT OPTION相對應(yīng)。CASCADE告訴SQL Server,如果用戶在WITH GRANT OPTION規(guī)則下授予了其他人訪問權(quán)限,則對于所有這些被授予權(quán)限的人,也將撤銷他們的訪問權(quán)限。
同樣,AS關(guān)鍵字只是用來說明想要基于哪個角色發(fā)出這一命令。
我們使用sa連接,撤銷授予的到NorthwindSecure中的Region表的訪問權(quán)限。
執(zhí)行完該語句后,TestAccount將不能再在Region表上運(yùn)行SELECT語句。
為了撤銷DENY,我們同樣也發(fā)出一個REVOKE語句。這一次,將重新獲得到Employees表的訪問權(quán)限:
現(xiàn)在,我們已經(jīng)了解所有這些命令是如何針對單個用戶來控制訪問權(quán)限的,接下來,看這樣一種方法,該方法通過分組管理來極大簡化對這些權(quán)限的管理。
22.3.3 用戶權(quán)限和語句級別的許可
用戶許可權(quán)限并不僅僅局限于數(shù)據(jù)庫中的對象上——它們也能擴(kuò)展到某些其他的語句,這些語句不直接與任何特定的對象束縛在一起。SQL Server允許你對運(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)在為止,除了兩個備份命令外,其他所有的這些命令我們都已經(jīng)在操作中見過了。(備份命令要做什么是不言自明的,因此,眼下不準(zhǔn)備在這上面花費(fèi)時間,我們將在第24章中討論它們——只需記住,它們是你能夠在語句級別進(jìn)行控制的東西。)
那么,我們?nèi)绾沃概蛇@些許可權(quán)限呢?實(shí)際上,現(xiàn)在你 已經(jīng)見過GRANT、REVOKE和DENY針對對象的運(yùn)作,那么,在語句級別的許可權(quán)限上你也已經(jīng)有了相當(dāng)?shù)牧私?。從語法構(gòu)成上說,它們與對象級別的許 可權(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)限:
你會得到命令成功執(zhí)行的確認(rèn)消息。然后,再次嘗試運(yùn)行CREATE語句(記住使用TestAccount登錄):
這一次一切順利。
在對象級別的許可權(quán)限上,DENY和REVOKE也以同樣的方式工作。
您可能感興趣的文章:
  • sqlserver 2000中每個服務(wù)器角色的解釋
  • SQL SERVER 利用存儲過程查看角色和用戶信息的寫法
  • asp.net+sqlserver實(shí)現(xiàn)的簡單高效的權(quán)限設(shè)計(jì)示例
  • SQLServer 2005 控制用戶權(quán)限訪問表圖文教程
  • SQL Server SA權(quán)限總結(jié)經(jīng)典技術(shù)
  • SQL Server中通用數(shù)據(jù)庫角色權(quán)限的處理詳解

標(biāo)簽:崇左 衡水 蘭州 銅川 湖南 仙桃 湘潭 黃山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《sql server 2005用戶權(quán)限設(shè)置深入分析》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266