


修改SQL Server 2005執行環境
SQL Server 2005包含了EXECUTE AS語句,通過使用EXECUTE AS語句,您可以為批處理和過程轉換執行環境,這樣,調用該批處理或過程的用戶就可以使用不同的權限來操作了。
所有權鏈
在我正式講解SQL Server 2005中執行環境的問題之前,先來簡單地說說所有權鏈的工作原理。
當用戶執行一個存儲過程的時候(假定該用戶擁有執行該存儲過程的權限),SQL Server將該存儲過程的所有者與這個存儲過程所涉及到的對象的所有者進行對比,如果他們的所有者相同,那么就不必對這些引用對象的權限進行評估了。
所以,如果用戶Tim獲得了存儲過程usp_ProcedureChain的權限,而usp_ProcedureChain存儲過程的所有者是dbo,那么,如果dbo還同時擁有usp_ProcedureChain所調用的其他存儲過程,那么Tim在執行這個存儲過程的時候就不會出現錯誤。
執行環境的轉換
在SQL Server 2000中,您可以使用SETUSER命令來模擬SQL用戶的執行環境,但問題在于,只有系統管理員或者數據庫的所有者才能使用這個命令,而且Windows賬戶也不能使用該命令。
在SQL Server 2005中,EXECUTE AS語句可以替代SETUSER來改變存儲過程、觸發器、批處理或者函數的執行環境。如果執行環境變成了另外一個用戶,那么SQL Server將檢查該用戶的權限。如果您需要在創建或修改一個存儲過程或函數的時候指定EXECUTE AS語句,您需要具備IMPERSONATE的權限,以及創建該對象的權限。
實例
正如我剛才所介紹的一樣,改變存儲過程的執行環境非常有用,接下來我將通過實例來講解如何實現這一功能。在這個例子中,您會看到如何使用EXECUTE AS將沒有確切權限的使用者模擬為所有者對表格進行插入操作。
在第一行語句中,我使用了REVERT命令,這樣,您就可以完整地返回到例子中,而不必擔心需要清除任何對象。
REVERT |
在下面的代碼的第七行,我使用了清除語句,這樣可以檢查我在隨后的例子中要使用的對象是否已經存在,如果已經存在,就將其清除。
IF OBJECT_ID('usp_InsertMyTable','P')>0 |
以下的腳本語句創建了兩個登錄名和數據庫的用戶賬戶,注意,CHECK_EXPIRATION和CHECK_POLICY語句,這兩條語句是SQL Server 2005中新出現的。這些語句告訴SQL Server不要對這個用戶賬戶強制執行密碼截止期限策略,同時也不要進行任何類型的密碼策略檢查,對于強制安全策略而言,這些是非常有效的方法。
CREATE LOGIN [BaseUser] WITH PASSWORD=N'baseuser', |
在SQL Server 2005中,模式不再是和數據庫用戶相同的事情了,對于所包含的對象而言,它處于完全不同的名稱空間。用戶和模式的分離是SQL Server 2005中的一大進步,這樣做使對象的所有權可以分離,而且比SQL Server 2000更易于管理,以下的語句創建了我們將要使用的數據庫模式:
CREATE SCHEMA [TableOwnerSchema] AUTHORIZATION [TableOwner] |
首先,我使用了EXECUTE AS命令,我將當前的執行環境設定為TableOwner,在運行了這個命令之后,所有的權限評估將以TableOwner運行,而以前的系統管理員權限將不再適用。
EXECUTE AS USER = 'TableOwner' |
運行這個語句就能夠表明現在的執行環境是TableOwner:
SELECT SESSION_USER |
這個腳本將在TableOwnerSchema的模式中創建一個名為MyTable的表格,因為我已經賦予了該用戶CREATE TABLE 的權限,所以TableOwner可以執行這條語句。
CREATE TABLE TableOwnerSchema.MyTable |
當我運行REVERT語句的時候,可以在執行環境鏈中回退一步,在SQL Server 2005中,執行環境是可以嵌套的,所以如果您在同一個數據庫連接中有很多用戶在運行,您可能需要多次執行該語句以返回到原始的登錄環境。
REVERT |
現在我要對新的表格進行快速選擇以確認它的存在:
SELECT * FROM TableOwnerSchema.MyTable |
以下的腳本創建了一個過程可以插入新的TableOwnerSchema.MyTable表格,注意我在過程定義中使用了WITH EXECUTE AS 'TableOwner'語句,這意味著該過程被執行的時候,它將在TableOwner的執行環境中被執行。
CREATE PROCEDURE usp_InsertMyTable |
我還可以將執行權限賦予一個用戶賬戶,在這種情況下,我使用以前創建的名為BaseUser的用戶。
GRANT EXEC ON usp_InsertMyTable TO BaseUser |
接下來,我將執行環境轉換為BaseUser并嘗試運行存儲過程:
EXECUTE AS USER = 'BaseUser' |
現在我可以向TableSchema.MyTable表格中添加記錄了,因為在這個過程中TableOwner允許我這樣做,而BaseOwner并沒有明確的權限可以向該表格添加記錄,所以該用戶的任何嘗試都會導致錯誤的發生。為了演示這個問題,可以運行以下的腳本,該腳本改變了我們剛才的過程,改為運行在調用者的執行環境中。
REVERT |
開發者和數據庫管理員會發現在執行存儲過程的時候轉換權限非常有用,尤其是您處理TRUNCATE TABLE語句的時候,這個方法能幫上大忙,因為TRUNCATE TABLE并沒有可以指定的權限。您可以將權限賦予將要進行截取表格操作的用戶,然后在操作結束的時候再將原有的權限設定恢復就可以了。
關鍵字:數據庫、SQL Server
新文章:
- CentOS7下圖形配置網絡的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統后丟失windows啟動項
- CentOS單網卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網打印機IP講解
- CentOS7使用hostapd實現無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網絡重啟出錯
- 解決Centos7雙系統后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統有什么不同呢
- Centos 6.6默認iptable規則詳解