Tabelle abschneiden Das Festlegen von Berechtigungen für Objekte wie gespeicherte Prozeduren kann folgendermaßen erfolgen:
GRANT EXECUTE ON <schema>.<object> to <user>;
Möglicherweise möchten Sie jedoch auch Sicherheitsrechte sowohl auf Anmelde- als auch auf Benutzerebene erteilen. Sie möchten NUR die erforderlichen Rechte für die Objekte festlegen und gewähren, die Zugriff benötigen (z. B. Ausführung). Erwägen Sie die Verwendung der EXECUTE AS
Funktion, die das Identitätswechsel eines anderen Benutzers ermöglicht, um Berechtigungen zu validieren, die zum Ausführen des Codes erforderlich sind, ohne alle erforderlichen Rechte für alle zugrunde liegenden Objekte (z. B. Tabellen) erteilen zu müssen. EXECUTE AS
kann zu gespeicherten Prozeduren, Funktionen, Triggern usw. hinzugefügt werden
Fügen Sie den Code wie folgt direkt in der gespeicherten Prozedur hinzu:
CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER
In diesem Fall geben Sie sich als Eigentümer des aufgerufenen Moduls aus. Sie können sich auch als SELBST oder als Benutzer ausgeben, der das Modul erstellt oder ändert, ODER ... imperonate CALLER, wodurch das Modul die Berechtigungen des aktuellen Benutzers übernehmen kann Der Eigentümer der Prozedur mit dem Namen OR ... gibt sich als 'Benutzername' aus, wodurch sich ein bestimmter Benutzer als OR ... gibt sich als 'Anmeldename' mit einem bestimmten Anmeldenamen aus.
In den EXECUTE
meisten Fällen müssen Sie nur Rechte für gespeicherte Prozesse erteilen, und dann werden Rechte für alle Objekte erteilt, auf die im gespeicherten Prozess verwiesen wird.
Auf diese Weise müssen Sie KEINE impliziten Rechte vergeben (Beispiel: Daten aktualisieren oder zusätzliche Prozesse aufrufen). Ownership Chaining übernimmt dies für Sie. Dies ist besonders hilfreich für dynamisches SQL oder wenn Sie Aufgaben mit erhöhter Sicherheit erstellen müssen, z CREATE TABLE
. EXECUTE AS
ist ein nützliches Werkzeug, um dies zu berücksichtigen.
Dieses Beispiel kann all dies verdeutlichen:
Erstellen Sie einen Benutzer namens NoPrivUser mit öffentlichem Zugriff auf eine Datenbank (z. B. dbadb):
USE [master];
GO
CREATE LOGIN [NoPrivUser] WITH PASSWORD=N'ABC5%', DEFAULT_DATABASE=[dbadb],
CHECK_EXPIRATION=ON, CHECK_POLICY=ON;
GO
USE [DBAdb];
GO
CREATE USER [NoPrivUser] FOR LOGIN [NoPrivUser];
GO
HINWEIS: ERSTELLER ODER BESITZER DIESES VERFAHRENS ERFORDERN TABELLENRECHTE ERSTELLEN in der Zieldatenbank.
use DBAdb
go
CREATE PROCEDURE dbo.MyProcedure
WITH EXECUTE AS OWNER
truncate table MyTable
GO
GRANT EXEC ON dbo.MyProcedure TO NoPrivUser;
GO
-- Now log into your database server as NoPrivUser and run the following.
Mit der EXECUTE AS
Klausel wird die gespeicherte Prozedur im Kontext des Objektbesitzers ausgeführt. Dieser Code wird erfolgreich erstellt dbo.MyTable
und Zeilen werden erfolgreich eingefügt. In diesem Beispiel hat der Benutzer NoPrivUser
absolut keine Berechtigung, die Tabelle zu ändern oder Daten in dieser Tabelle zu lesen oder zu ändern.
Es werden nur die Rechte übernommen, die zum Ausführen dieser bestimmten Aufgabe erforderlich sind, die im Rahmen dieses Verfahrens codiert wurde.
Diese Methode zum Erstellen gespeicherter Prozeduren, die Aufgaben ausführen können, für die erhöhte Sicherheitsrechte erforderlich sind, ohne diese Rechte dauerhaft zuzuweisen, ist sehr nützlich.