Nach meinem Verständnis kann ich die EXECUTE AS OWNER
Klausel als Teil einer von mir erstellten Prozedur verwenden, um den Hauptteil dieser Prozedur als einen anderen Benutzer auszuführen. Mein Ziel ist es, einen Befehl auszuführen, der die sysadmin
Rolle ( DBCC TRACEON(1224)
) erfordert . Diese Prozedur soll von einem nicht privilegierten Benutzer aufgerufen werden.
Ich habe das folgende Skript unter dem sa
Benutzer ausgeführt:
SELECT USER_NAME(), USER_ID(), IsSysAdmin = IS_SRVROLEMEMBER('sysadmin')
-- dbo 1 1
IF EXISTS(SELECT * FROM sys.procedures WHERE name = 'MyProc')
DROP PROCEDURE MyProc
GO
CREATE PROCEDURE MyProc
WITH EXECUTE AS OWNER
AS
SELECT USER_NAME(), USER_ID(), IsSysAdmin = IS_SRVROLEMEMBER('sysadmin');
-- dbo 1 0
DBCC TRACEON(1224)
--Msg 2571, Level 14, State 3, Procedure MyProc, Line 7
--User 'dbo' does not have permission to run DBCC TRACEON.
RETURN
GO
EXEC MyProc
Die Ausgabe erfolgt in Kommentaren inline. Es stellt sich heraus, dass ich außerhalb des Verfahrens eine sysadmin
Mitgliedschaft zu haben scheine , aber nicht innerhalb des Verfahrens.
Die Prozedur gehört dem dbo
Benutzer. Ich verstehe, dass es nicht möglich ist, die sysadmin
Rolle einem Datenbankbenutzer zuzuweisen (zumindest bietet die GUI diese Möglichkeit nicht). Ich sehe also nicht ein, wie ich jemals einen Datenbankbenutzer dazu bringen könnte, eine Serverrolle zu übernehmen.
Ich habe auch versucht, EXECUTE AS 'sa'
was dazu führt Cannot execute as the user 'sa', because it does not exist or you do not have permission.
. In der Dokumentation heißt es, dass ich nur einen Benutzernamen angeben kann, keinen Anmeldenamen. Ich verstehe also, warum das nicht funktioniert hat.
Wie kann ich meine Prozedur mit sysadmin
Rollenmitgliedschaft ausführen ?