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 ?
quelle
CREATE PROCEDURE
Berechtigungen tun und sich als solche ausgeben können. Es ist momentan nicht so sehr das Risiko, sondern das Risiko, nachdem alle vergessen haben, warum Sie überhaupt eine separate Datenbank erstellt haben.Sie schlagen eine Lücke in Ihrer Sicherheit, indem Sie einem nicht privilegierten Benutzer erlauben, als Systemadministratorrolle ausgeführt zu werden.
Wenn Sie versuchen, ein
1224
Traceflag festzulegen, das die Sperreneskalation basierend auf der Anzahl der Sperren deaktiviert, können Sie dies auf Tabellenebene mithilfe von tunALTER TABLE
Beispiel: Unten wird die Eskalation der Sperre auf Partitionsebene für eine partitionierte Tabelle aktiviert. Wenn die Tabelle nicht partitioniert ist, wird die Sperreneskalation auf der Ebene TABLE festgelegt.
ALTER TABLE dbo.T1 SET (LOCK_ESCALATION = AUTO);
- Gültige Optionen sind AUTO, TABLE und DISABLEJetzt können Sie einem unvorhergesehenen Benutzer nur die Rechte zum Ändern der Tabelle erteilen.
HTH
quelle
ALTER_TABLE
genau erfasst und überprüft, was er tut, bevor er dies zulässt (genauer gesagt, bevor er nicht zurückgesetzt wird).1224
da dieses Trace-Flag auf Tabellenebene ausgeführt wird. Ich habe diese Antwort als Blick auf die Trace-Flag-Definition geschrieben. Sie kann alternativ mit Alter Table aktiviert werden .Das Erstellen eines SQL Server-Agent-Jobs (im Besitz eines Sysadmin-Mitglieds) reicht aus, obwohl mir klar ist, dass dies keine sehr hübsche Lösung ist.
Der Benutzer kann den Job (ansynchron) mit msdb.dbo.sp_start_job starten. Das synchrone Ausführen eines Agent-Jobs erfordert jedoch einige weitere Codezeilen, wenn dies erforderlich ist. Außerdem muss der SQL Server-Agent-Dienst natürlich ausgeführt werden.
quelle