修改SQL Server 2005 數(shù)據(jù)庫的執(zhí)行環(huán)境很簡單
以下的文章主要向大家講述的是正確修改SQL Server 2005 數(shù)據(jù)庫的執(zhí)行環(huán)境,我們這篇文章是在環(huán)境為SQL Server數(shù)據(jù)庫里設(shè)定用戶權(quán)限的認證方式,比如,當您在登錄SQL Server時,登錄賬戶就會被賦予了一定的權(quán)限。
其中可能包括登錄的功能、訪問數(shù)據(jù)庫以及在數(shù)據(jù)庫中執(zhí)行某些操作的功能。
在SQL Server 2005中包含了EXECUTE AS語句,通過使用EXECUTE AS語句,您可以為批處理和過程轉(zhuǎn)換執(zhí)行環(huán)境,這樣,調(diào)用該批處理或過程的用戶就可以使用不同的權(quán)限來操作了。
所有權(quán)鏈
在正式講解SQL Server 2005中執(zhí)行環(huán)境的問題之前,我們先來說說所有權(quán)鏈的工作原理。
當用戶執(zhí)行一個存儲過程的時候(假定該用戶擁有執(zhí)行該存儲過程的權(quán)限),SQL Server將該存儲過程的所有者與這個存儲過程所涉及到的對象的所有者進行對比,如果他們的所有者相同,那么就不必對這些引用對象的權(quán)限進行評估了。
所以,如果用戶Tim獲得了存儲過程usp_ProcedureChain的權(quán)限,而usp_ProcedureChain存儲過程的所有者是dbo,那么,如果dbo還同時擁有usp_ProcedureChain所調(diào)用的其他存儲過程,那么Tim在執(zhí)行這個存儲過程的時候就不會出現(xiàn)錯誤。
執(zhí)行環(huán)境的轉(zhuǎn)換
在SQL Server 2000中,您可以使用SETUSER命令來模擬SQL用戶的執(zhí)行環(huán)境,但問題在于,只有系統(tǒng)管理員或者數(shù)據(jù)庫的所有者才能使用這個命令,而且Windows賬戶也不能使用該命令。
在SQL Server 2005中,EXECUTE AS語句可以替代SETUSER來改變存儲過程、觸發(fā)器、批處理或者函數(shù)的執(zhí)行環(huán)境。如果執(zhí)行環(huán)境變成了另外一個用戶,那么SQL Server將檢查該用戶的權(quán)限。如果您需要在創(chuàng)建或修改一個存儲過程或函數(shù)的時候指定EXECUTE AS語句,您需要具備IMPERSONATE的權(quán)限,以及創(chuàng)建該對象的權(quán)限。
示例:
正如剛才所介紹的一樣,改變存儲過程的執(zhí)行環(huán)境非常有用,接下來我們將通過實例來講解如何實現(xiàn)這一功能。在這個例子中,您會看到如何使用EXECUTE AS將沒有確切權(quán)限的使用者模擬為所有者對表格進行插入操作。
在***行語句中使用了REVERT命令,這樣,您就可以完整地返回到例子中,而不必擔心需要清除任何對象。
REVERT GO
在下面的代碼的第七行使用了清除語句,這樣可以檢查我在隨后的例子中要使用的對象是否已經(jīng)存在,如果已經(jīng)存在,就將其清除。
- IF OBJECT_ID('usp_InsertMyTable','P')>0 DROP PROCEDURE usp_InsertMyTable GO
- IF OBJECT_ID('TableOwnerSchema.MyTable','U')>0 DROP TABLE TableOwnerSchema.
- MyTable GO IF EXISTS (SELECT * FROM sys.schemas WHERE name = N'TableOwnerSchema')
- DROP SCHEMA [TableOwnerSchema] IF EXISTS (SELECT * FROM sys.database_principals
- WHERE name = N'BaseUser') DROP USER BaseUser IF EXISTS
- (SELECT * FROM sys.server_principals WHERE name = N'BaseUser')
- DROP LOGIN BaseUser IF EXISTS (SELECT * FROM sys.database_principals
- WHERE name = N'TableOwner') DROP USER TableOwner IF EXISTS
- (SELECT * FROM sys.server_principals WHERE name = N'TableOwner') DROP LOGIN TableOwner
以下的腳本語句創(chuàng)建了兩個登錄名和數(shù)據(jù)庫的用戶賬戶,注意,CHECK_EXPIRATION和CHECK_POLICY語句,這兩條語句是SQL Server 2005中新出現(xiàn)的。這些語句告訴SQL Server不要對這個用戶賬戶強制執(zhí)行密碼截止期限策略,同時也不要進行任何類型的密碼策略檢查,對于強制安全策略而言,這些是非常有效的方法。
- CREATE LOGIN [BaseUser] WITH PASSWord=N'baseuser',
- DEFAULT_DATABASE=[TRS], CHECK_EXPIRATION=OFF,
- CHECK_POLICY=OFF GO CREATE USER [BaseUser] FOR LOGIN [BaseUser]
- GO CREATE LOGIN [TableOwner] WITH PASSWORD=N'tableowner',
- DEFAULT_DATABASE=[TRS], CHECK_EXPIRATION=OFF,
- CHECK_POLICY=OFF GO CREATE USER TableOwner FOR LOGIN TableOwner GO
在SQL Server 2005中,模式不再是和數(shù)據(jù)庫用戶相同的事情了,對于所包含的對象而言,它處于完全不同的名稱空間。用戶和模式的分離是SQL Server 2005中的一大進步,這樣做使對象的所有權(quán)可以分離,而且比SQL Server 2000更易于管理,以下的語句創(chuàng)建了我們將要使用的數(shù)據(jù)庫模式:
- CREATE SCHEMA [TableOwnerSchema] AUTHORIZATION [TableOwner]
- GO Now I enable logins so they can be used: ALTER LOGIN [TableOwner]
- ENABLE ALTER LOGIN [BaseUser] ENABLE GO GRANT CREATE TABLE TO TableOwner GO
在此部分,首先使用EXECUTE AS命令,將當前的執(zhí)行環(huán)境設(shè)定為TableOwner,在運行了這個命令之后,所有的權(quán)限評估將以TableOwner運行,而以前的系統(tǒng)管理員權(quán)限將不再適用。
- EXECUTE AS USER = 'TableOwner' GO
運行這個語句就能夠表明現(xiàn)在的執(zhí)行環(huán)境是TableOwner:
- SELECT SESSION_USER GO
這個腳本將在TableOwnerSchema的模式中創(chuàng)建一個名為MyTable的表格,因為我已經(jīng)賦予了該用戶CREATE TABLE 的權(quán)限,所以TableOwner可以執(zhí)行這條語句。
- CREATE TABLE TableOwnerSchema.MyTable ( Field1 INT ) GO
運行REVERT語句的時候,可以在執(zhí)行環(huán)境鏈中回退一步,在SQL Server 2005中,執(zhí)行環(huán)境是可以嵌套的,所以如果您在同一個數(shù)據(jù)庫連接中有很多用戶在運行,您可能需要多次執(zhí)行該語句以返回到原始的登錄環(huán)境。
- REVERT GO SELECT SESSION_USER GO
現(xiàn)在需要對新的表格進行快速選擇以確認它的存在:
- SELECT * FROM TableOwnerSchema.MyTable GO
以下的腳本創(chuàng)建了一個過程可以插入新的TableOwnerSchema.MyTable表格,注意我在過程定義中使用了WITH EXECUTE AS 'TableOwner'語句,這意味著該過程被執(zhí)行的時候,它將在TableOwner的執(zhí)行環(huán)境中被執(zhí)行。
- CREATE PROCEDURE usp_InsertMyTable WITH EXECUTE AS
- 'TableOwner' AS BEGIN INSERT INTO TableOwnerSchema.MyTable(Field1)VALUES(8) END GO
您還可以將執(zhí)行權(quán)限賦予一個用戶賬戶,在這種情況下,可以使用以前創(chuàng)建的名為BaseUser的用戶。
- GRANT EXEC>
接下來將執(zhí)行環(huán)境轉(zhuǎn)換為BaseUser并嘗試運行存儲過程:
- EXECUTE AS USER = 'BaseUser' GO EXEC usp_InsertMyTable GO
現(xiàn)在你可以向TableSchema.MyTable表格中添加記錄了,因為在這個過程中TableOwner允許我們這樣做,而BaseOwner并沒有明確的權(quán)限可以向該表格添加記錄,所以該用戶的任何嘗試都會導(dǎo)致錯誤的發(fā)生。為了演示這個問題,可以運行以下的腳本,該腳本改變了我們剛才的過程,改為運行在調(diào)用者的執(zhí)行環(huán)境中。
- REVERT GO ALTER PROCEDURE usp_InsertMyTable AS BEGIN INSERT
- INTO TableOwnerSchema.MyTable(Field1)VALUES(8) END GO EXECUTE AS USER =
- 'BaseUser' GO EXEC usp_InsertMyTable GO REVERT
許多開發(fā)者和數(shù)據(jù)庫管理員會發(fā)現(xiàn)在執(zhí)行存儲過程的時候轉(zhuǎn)換權(quán)限十分有用,尤其是您處理TRUNCATE TABLE語句的時候,這個方法能幫上大忙,因為TRUNCATE TABLE并沒有可以指定的權(quán)限。您可以將權(quán)限賦予將要進行截取表格操作的用戶,然后,在操作結(jié)束時將原有的權(quán)限設(shè)定恢復(fù)就可以完成***的操作了。
上述的相關(guān)內(nèi)容就是對正確修改SQL Server 2005 數(shù)據(jù)庫的執(zhí)行環(huán)境的描述,希望會給你帶來一些幫助在此方面。
【編輯推薦】