Sql-Server

如何從另一個數據庫授予在 master 數據庫中執行儲存過程的權限

  • February 3, 2020

我們的開發人員有一個由他們的應用程序使用的域帳戶,該帳戶需要能夠使用伺服器上其他數據庫(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!

引用自:https://dba.stackexchange.com/questions/258803