問題
以前,我們學習過在SQL Server 2005中用EXECUTE AS命令來授予權限的方法,你已經看到如何用EXECUTE AS從句來授予粒度權限。在一個可編程的對象比如存儲過程或函數內切換上下文是很重要的,尤其是如果訪問存儲過程的用戶沒有足夠的權限去運行一個代碼塊時。但為了把它更加粒度化,只有在需要的時候和返回到調用方的原來的執行上下文情況下,我們才允許切換執行上下文。我們要怎麼實現這一點?
專家解答
SQL Server 2005中的EXECUTE AS從句讓我們擁有控制代碼模塊執行的安全上下文的選擇權。擴展這一概念,我們用REVERT從句把執行上下文切換回執行上一個EXECUTE AS語句的調用方。這讓我們能夠允許用戶在需要的時候扮演高權限的賬戶並且在有限的權限下返回到原來的執行上下文中。例如,在數據庫中基於一些業務邏輯做出一些改動的存儲過程。在運行代碼塊來改變數據之前,你需要創建一個數據庫備份,這個數據庫備份可以在任何需要的時候回滾這些變化。因為我們不想給將要執行存儲過程的用戶更多的權限,所以我們將使用EXECUTE AS從句去扮演一個具有更多權限的賬戶,讓這個賬戶來做數據庫備份,也使用REVERT從句切換回調用方的原來的執行上下文。讓我們來看看一個示例腳本演示這兩個從句如何進行。
首先,我們登錄到SQL Server.其中,有一個是具有很小權限的普通用戶,另一個是系統管理員角色中的一個成員。
USE master
GO
--Add Windows logins to SQL Server
IF NOT EXISTS (SELECT * FROM sys.syslogins WHERE name = 'SQLSRV90\SQLUser1')
CREATE LOGIN [SQLSRV90\SQLUser1]
FROM WINDOWS
WITH DEFAULT_DATABASE = AdventureWorks
IF NOT EXISTS (SELECT * FROM sys.syslogins WHERE name = 'SQLSRV90\SQLDBA')
CREATE LOGIN [SQLSRV90\SQLDBA]
FROM WINDOWS
WITH DEFAULT_DATABASE = AdventureWorks
接著,我們在AdventureWorks數據庫中增加用戶的登錄。
USE AdventureWorks
--Add the new logins to the AdventureWorks database
CREATE USER SQLUser1 FOR LOGIN [SQLSRV90\SQLUser1]
CREATE USER SQLDBA FOR LOGIN [SQLSRV90\SQLDBA]
--Add SQLDBA Windows account to the db_owner role
EXEC sp_addrolemember 'db_owner', 'SQLDBA'
GO