修改SQL Server 2005執(zhí)行環(huán)境實(shí)例演示
此文主要是介紹正確對(duì)SQL Server 2005執(zhí)行環(huán)境進(jìn)行修改是實(shí)際操作的實(shí)例演示,正如我上一篇文章里所介紹的一樣,改變存儲(chǔ)過程的SQL Server 2005數(shù)據(jù)庫的執(zhí)行環(huán)境非常有用,接下來我將通過實(shí)例來講解如何實(shí)現(xiàn)這一功能。
在這個(gè)例子中,您會(huì)看到如何使用EXECUTE AS將沒有確切權(quán)限的使用者模擬為所有者對(duì)表格進(jìn)行插入操作。
在第一行語句中,我使用了REVERT命令,這樣,您就可以完整地返回到例子中,而不必?fù)?dān)心需要清除任何對(duì)象。
- REVERT
- GO
在下面的代碼的第七行,我使用了清除語句,這樣可以檢查我在隨后的例子中要使用的對(duì)象是否已經(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)建了兩個(gè)登錄名和數(shù)據(jù)庫的用戶賬戶,注意,CHECK_EXPIRATION和CHECK_POLICY語句,這兩條語句是SQL Server 2005中新出現(xiàn)的。這些語句告訴SQL Server不要對(duì)這個(gè)用戶賬戶強(qiáng)制執(zhí)行密碼截止期限策略,同時(shí)也不要進(jìn)行任何類型的密碼策略檢查,對(duì)于強(qiáng)制安全策略而言,這些是非常有效的方法。
- 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ù)庫用戶相同的事情了,對(duì)于所包含的對(duì)象而言,它處于完全不同的名稱空間。用戶和模式的分離是SQL Server 2005中的一大進(jìn)步,這樣做使對(duì)象的所有權(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命令,我將當(dāng)前的SQL Server 2005執(zhí)行環(huán)境設(shè)定為TableOwner,在運(yùn)行了這個(gè)命令之后,所有的權(quán)限評(píng)估將以TableOwner運(yùn)行,而以前的系統(tǒng)管理員權(quán)限將不再適用。
- EXECUTE AS USER = 'TableOwner'
- GO
運(yùn)行這個(gè)語句就能夠表明現(xiàn)在的SQL Server 2005執(zhí)行環(huán)境是TableOwner:
- SELECT SESSION_USER
- GO
這個(gè)腳本將在TableOwnerSchema的模式中創(chuàng)建一個(gè)名為MyTable的表格,因?yàn)槲乙呀?jīng)賦予了該用戶CREATE TABLE 的權(quán)限,所以TableOwner可以執(zhí)行這條語句。
- CREATE TABLE TableOwnerSchema.MyTable
- (
- Field1 INT
- )
- GO
當(dāng)我運(yùn)行REVERT語句的時(shí)候,可以在SQL Server 2005執(zhí)行環(huán)境鏈中回退一步,在SQL Server 2005中,執(zhí)行環(huán)境是可以嵌套的,所以如果您在同一個(gè)數(shù)據(jù)庫連接中有很多用戶在運(yùn)行,您可能需要多次執(zhí)行該語句以返回到原始的登錄環(huán)境。
- REVERT
- GO
- SELECT SESSION_USER
- GO
現(xiàn)在我要對(duì)新的表格進(jìn)行快速選擇以確認(rèn)它的存在:
- SELECT * FROM TableOwnerSchema.MyTable
- GO
以下的腳本創(chuàng)建了一個(gè)過程可以插入新的TableOwnerSchema.MyTable表格,注意我在過程定義中使用了WITH EXECUTE AS 'TableOwner'語句,這意味著該過程被執(zhí)行的時(shí)候,它將在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)限賦予一個(gè)用戶賬戶,在這種情況下,我使用以前創(chuàng)建的名為BaseUser的用戶。
- GRANT EXEC ON usp_InsertMyTable TO BaseUser
- GO
接下來,我將SQL Server 2005執(zhí)行環(huán)境轉(zhuǎn)換為BaseUser并嘗試運(yùn)行存儲(chǔ)過程:
- EXECUTE AS USER = 'BaseUser'
- GO
- EXEC usp_InsertMyTable
- GO
現(xiàn)在我可以向TableSchema.MyTable表格中添加記錄了,因?yàn)樵谶@個(gè)過程中TableOwner允許我這樣做,而BaseOwner并沒有明確的權(quán)限可以向該表格添加記錄,所以該用戶的任何嘗試都會(huì)導(dǎo)致錯(cuò)誤的發(fā)生。為了演示這個(gè)問題,可以運(yùn)行以下的腳本,該腳本改變了我們剛才的過程,改為運(yùn)行在調(diào)用者的SQL Server 2005執(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ù)庫管理員會(huì)發(fā)現(xiàn)在執(zhí)行存儲(chǔ)過程的時(shí)候轉(zhuǎn)換權(quán)限非常有用,尤其是您處理TRUNCATE TABLE語句的時(shí)候,這個(gè)方法能幫上大忙,因?yàn)門RUNCATE TABLE并沒有可以指定的權(quán)限。您可以將權(quán)限賦予將要進(jìn)行截取表格操作的用戶,然后在操作結(jié)束的時(shí)候再將原有的權(quán)限設(shè)定恢復(fù)就可以了。
【編輯推薦】