Sql-Server
如何從另一個數據庫授予在 master 數據庫中執行儲存過程的權限
我們的開發人員有一個由他們的應用程序使用的域帳戶,該帳戶需要能夠使用伺服器上其他數據庫(SQL Server 2012 企業版)的“sp_”命名約定執行在主數據庫中創建的儲存過程。
我知道這不是推薦的做法,但這樣做的決定是由比我更有權威的其他人做出的。
我自己從伺服器上的任何數據庫執行此類儲存過程都沒有問題,但我也有系統管理員權限,並且希望授予該使用者盡可能少的權限。
這是我嘗試過的:
--create procedure for purpose of testing USE [master] GO CREATE PROCEDURE dbo.sp_HelloWorld AS PRINT 'Hello World!' GO --create login for test user USE [master] GO CREATE LOGIN [DOMAIN\user] FROM WINDOWS GO --create user in master database USE [master] GO CREATE USER [DOMAIN\user] FOR LOGIN [DOMAIN\user] GO --create user in another database on server USE MyDB GO CREATE USER [DOMAIN\user] FOR LOGIN [DOMAIN\user] GO --grant execute permission on stored procedure in master database USE [master] GO GRANT EXECUTE ON dbo.sp_HelloWorld TO [DOMAIN\user] GO
我可以
EXEC dbo.sp_HelloWorld
毫無問題地從伺服器上的任何數據庫執行自己。我還可以執行以下命令:
USE [master] GO EXECUTE AS USER='DOMAIN\user' EXEC dbo.sp_HelloWorld REVERT
但是在模擬使用者時嘗試從任何其他數據庫的上下文中執行儲存過程:
USE MyDB GO EXECUTE AS USER='DOMAIN\user' EXEC dbo.sp_HelloWorld REVERT
導致以下錯誤:
消息 229,級別 14,狀態 5,過程 sp_HelloWorld,第 1 行
$$ Batch Start Line 15 $$ 對象“sp_HelloWorld”、數據庫“master”、模式“dbo”的 EXECUTE 權限被拒絕。
我錯過了什麼?
我錯過了什麼?
DOMAIN\user
登錄應該能夠 在上下文中dbo.sp_HelloWorld
與它的相應使用者一起執行。MyDB
該
EXECUTE AS USER
命令是返回錯誤的原因。指定要模擬的上下文是目前數據庫中的使用者。模擬的範圍僅限於目前數據庫。到數據庫使用者的上下文切換不會繼承該使用者的伺服器級權限。
重要部分:模擬的範圍僅限於目前數據庫。
這就是為什麼
master
在使用EXECUTE AS USER
.
EXECUTE AS LOGIN
如果您想要正確的登錄名/使用者映射,則需要使用指定要模擬的執行上下文是登錄名。模擬的範圍是在伺服器級別。
USE MyDB GO EXECUTE AS LOGIN ='DOMAIN\user' EXEC dbo.sp_HelloWorld REVERT
結果
Hello World!