Erläuterungen zu gespeicherten Prozeduren mit Aufruferrechten und Eigentümerrechten¶
Eine gespeicherte Prozedur wird entweder mit den Rechten des Aufrufers oder mit den Rechten des Eigentümers ausgeführt. Sie kann nicht mit beiden gleichzeitig ausgeführt werden. Unter diesem Thema werden die Unterschiede zwischen einer gespeicherten Prozedur mit Aufruferrechten und einer gespeicherten Prozedur mit Eigentümerrechten beschrieben.
Unter diesem Thema:
Einführung¶
Eine gespeicherte Prozedur mit Aufruferrechten mit den Berechtigungen des Aufrufers ausgeführt. Der Hauptvorteil einer gespeicherten Prozedur mit Aufruferrrechten besteht darin, dass diese auf Informationen über diesen Aufrufer oder über die aktuelle Sitzung des Aufrufers zugreifen kann. Beispielsweise kann eine gespeicherte Prozedur mit Aufruferrechen die Sitzungsvariablen des Aufrufers lesen und in einer Abfrage verwenden.
Eine gespeicherte Prozedur mit Eigentümerrechen wird hauptsächlich mit den Berechtigungen des Eigentümers der gespeicherten Prozedur ausgeführt. Der Hauptvorteil einer gespeicherten Prozedur mit Eigentümerrechen besteht darin, dass der Eigentümer bestimmte Verwaltungsaufgaben, z. B. das Bereinigen alter Daten, an eine andere Rolle delegieren kann, ohne dieser Rolle allgemeinere Berechtigungen zu erteilen, z. B. Berechtigungen zum Löschen aller Daten aus einer bestimmten Tabelle.
Zum Zeitpunkt der Erstellung der gespeicherten Prozedur gibt der Ersteller an, ob die Prozedur mit Eigentümerrechen oder mit Aufruferrechten ausgeführt wird. Die Standardeinstellung ist eine Prozedur mit Eigentümerrechten.
Der Eigentümer der Prozedur kann mithilfe des Befehls ALTER PROCEDURE die gespeicherte Prozedur mit Eigentümerrechten in eine gespeicherte Prozedur mit Aufruferrechten (oder umgekehrt) ändern.
Berechtigungen für Datenbankobjekte¶
Eine gespeicherte Prozedur mit Aufruferrechten wird mit den Datenbankberechtigungen der Rolle ausgeführt, die die gespeicherte Prozedur aufgerufen hat. Anweisungen, die der Aufrufer außerhalb der gespeicherten Prozedur nicht ausführen konnte, können auch nicht innerhalb der gespeicherten Prozedur ausgeführt werden. Wenn beispielsweise die Rolle „Pflegekraft“ keine Berechtigungen zum Löschen von Zeilen aus der Tabelle medical_records
hat, und dann aber ein Benutzer mit der Rolle „Pflegekraft“ eine gespeicherte Prozedur mit Aufruferrechten aufruft, in der Zeilen aus dieser Tabelle gelöscht werden sollen, dann schlägt diese gespeicherte Prozedur fehl.
Eine Prozedur mit Eigentümerrechten wird mit den Berechtigungen des Eigentümers der Prozedur ausgeführt. Wenn der Eigentümer über die Berechtigungen zum Ausführen einer Aufgabe verfügt, kann die gespeicherte Prozedur diese Aufgabe auch dann ausführen, wenn sie von einer Rolle aufgerufen wird, die nicht über die Berechtigungen zum direkten Ausführen dieser Aufgabe verfügt. Beispiel: Die Rolle mit dem Namen „Arzt“ verfügt über die Datenbankberechtigungen zum Löschen von Zeilen aus der Tabelle medical_records
. Wenn diese Rolle „Arzt“ eine gespeicherte Prozedur erstellt, mit der Zeilen aus dieser Tabelle gelöscht werden, die älter als 7 Jahre sind, und dann die Rolle „Arzt“ der Rolle „Pflegekraft“ die entsprechenden Berechtigungen für die gespeicherte Prozedur gewährt, dann kann die Rolle „Pflegekraft“ die gespeicherte Prozedur ausführen (und alte Zeilen über diese gespeicherte Prozedur aus der Tabelle löschen), selbst wenn die Rolle „Pflegekraft“ keine Löschberechtigung für diese Tabelle hat.
Tipp
Wenn Sie eine gespeicherte Prozedur mit Eigentümerrechten benötigen, um Aktionen auf einer Tabelle, einer Ansicht oder einer Funktion auszuführen, für die der Aufrufer die Zugriffsberechtigung hat, können Sie den Aufrufer eine Referenz auf diese Tabelle, Ansicht oder Funktion übergeben lassen.
Weitere Informationen dazu finden Sie unter Übergegen von Referenzen auf Tabellen, Ansichten, Funktionen und Abfragen an gespeicherte Prozeduren.
Zugriff auf und Einstellung des Sitzungsstatus¶
Wie auch bei anderen SQL-Anweisungen wird eine CALL
-Anweisung innerhalb einer Sitzung ausgeführt und erbt den Kontext dieser Sitzung, z. B. Variablen auf Sitzungsebene, aktuelle Datenbank usw. Der genaue Kontext, den die Prozedur erbt, hängt davon ab, ob es sich bei der gespeicherten Prozedur um eine gespeicherte Prozedur mit Aufruferrechten oder eine gespeicherte Prozedur mit Eigentümerrechten handelt.
Wenn eine gespeicherte Prozedur mit Aufruferrechten Änderungen an der Sitzung vornimmt, können diese Änderungen nach dem Ende von CALL
bestehen bleiben. Gespeicherte Prozeduren mit Eigentümerrechten dürfen den Sitzungsstatus nicht ändern.
Gespeicherte Prozeduren mit Aufruferrechten¶
Gespeicherte Prozeduren mit Aufruferrechten halten sich in einer Sitzung an die folgenden Regeln:
Sie werden mit den Berechtigungen des Aufrufers ausgeführt, nicht mit den Berechtigungen des Eigentümers.
Sie übernehmen das aktuelle Warehouse des Aufrufers.
Sie verwenden die Datenbank und das Schema, die der Aufrufer gerade verwendet.
Kann Sitzungsvariablen des Aufrufers anzeigen, festlegen und aufheben.
Kann Sitzungsparameter des Aufrufers anzeigen, festlegen und aufheben.
Der Abschnitt unten enthält weitere Details dazu, wie gespeicherte Prozeduren mit Aufruferrechten Variablen des Aufrufers auf Sitzungsebene lesen und schreiben können.
Sitzungsvariablen für Prozeduren mit Aufruferrechten¶
Angenommen, die gespeicherte Prozedur mit dem Namen MyProcedure
führt SQL-Anweisungen aus, mit denen Variablen auf Sitzungsebene gelesen und geschrieben werden. Im folgenden Beispiel sind die Details zu den Lese- und Schreibbefehlen nicht wichtig, daher werden die Anweisungen als Pseudocode dargestellt:
READ SESSION_VAR1
SET SESSION_VAR2
Die gespeicherte Prozedur ähnelt dem folgenden Pseudocode:
CREATE PROCEDURE MyProcedure()
...
$$
READ SESSION_VAR1;
SET SESSION_VAR2;
$$
;
Führen Sie anschließend in derselben Sitzung folgende Anweisungssequenz aus:
SET SESSION_VAR1 = 'some interesting value';
CALL MyProcedure();
SELECT *
FROM table1
WHERE column1 = $SESSION_VAR2;
Dies entspricht der Ausführung der folgenden Anweisungssequenz:
SET SESSION_VAR1 = 'some interesting value';
READ SESSION_VAR1;
SET SESSION_VAR2;
SELECT *
FROM table1
WHERE column1 = $SESSION_VAR2;
Mit anderen Worten:
Die gespeicherte Prozedur kann die Variable sehen, die von Anweisungen festgelegt wurde, bevor die Prozedur aufgerufen wurde.
Die Anweisungen nach der gespeicherten Prozedur können die Variable sehen, die in der Prozedur festgelegt wurde.
Ein vollständiges Beispiel, das nicht auf Pseudocode basiert, finden Sie unter Verwenden von Sitzungsvariablen bei gespeicherten Prozeduren mit Aufrufer- und Eigentümerrechten (unter diesem Thema).
Häufig sollen in gespeicherten Prozeduren Kontextdaten wie die aktuelle Datenbank und die aktuellen Variablen auf Sitzungsebene vererbt werden.
In einigen Fällen soll eine gespeicherte Prozedur aber möglicherweise besser isoliert sein. Wenn Ihre gespeicherte Prozedur beispielsweise eine Variable auf Sitzungsebene festlegt, wollen Sie eventuell nicht, dass die Variable auf Sitzungsebene zukünftige Anweisungen außerhalb der gespeicherten Prozedur beeinflusst.
So isolieren Sie Ihre gespeicherte Prozedur besser vom Rest der Sitzung:
Vermeiden Sie eine direkte Verwendung von Variablen auf Sitzungsebene. Übergeben Sie diese stattdessen als explizite Parameter. Das zwingt den Aufrufer dazu, genau zu überlegen, welche Variablen der Sitzungsebene von der gespeicherten Prozedur verwendet werden sollen.
Bereinigen Sie alle Variablen der Sitzungsebene, die Sie in der gespeicherten Prozedur festgelegt haben (und verwenden Sie Namen, die wahrscheinlich nirgendwo sonst verwendet werden, sodass Sie nicht versehentlich eine Sitzungsvariable bereinigen, die bereits vor Aufruf der gespeicherten Prozedur vorhanden war).
In der folgenden gespeicherten Prozedur wird der Wert einer Sitzungsvariablen verwendet, indem der Wert als Parameter empfangen wird, und nicht, indem die Sitzungsvariable direkt verwendet wird:
SET Variable_1 = 49;
CREATE PROCEDURE sv_proc2(PARAMETER_1 FLOAT)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
var rs = snowflake.execute( {sqlText: "SELECT 2 * " + PARAMETER_1} );
rs.next();
var MyString = rs.getColumnValue(1);
return MyString;
$$
;
CALL sv_proc2($Variable_1);
In der folgenden gespeicherten Prozedur wird eine temporäre Sitzungsvariable mit einem ungewöhnlichen Namen erstellt und diese Variable vor Abschluss der gespeicherten Prozedur bereinigt. Wenn eine Anweisung nach dem Prozeduraufruf versucht, die bereinigte Sitzungsvariable zu verwenden, schlägt die Anweisung fehl:
CREATE PROCEDURE sv_proc1()
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$
var rs = snowflake.execute( {sqlText: "SET SESSION_VAR_ZYXW = 51"} );
var rs = snowflake.execute( {sqlText: "SELECT 2 * $SESSION_VAR_ZYXW"} );
rs.next();
var MyString = rs.getColumnValue(1);
rs = snowflake.execute( {sqlText: "UNSET SESSION_VAR_ZYXW"} );
return MyString;
$$
;
CALL sv_proc1();
-- This fails because SESSION_VAR_ZYXW is no longer defined.
SELECT $SESSION_VAR_ZYXW;
Bemerkung
Wenn Sie zum Programmieren die Sprachen C (oder ähnliche Sprachen wie Java) verwenden, beachten Sie, dass Sitzungsvariablen, die Sie in einer gespeicherten Prozedur festlegen, nicht den lokalen Variablen in C entsprechen, die nach Beendigung der Ausführung einer C-Funktion verschwinden. Das Isolieren einer gespeicherten Prozedur gegenüber seiner Umgebung erfordert in SQL mehr Aufwand als in C.
Gespeicherte Prozeduren mit Eigentümerrechten¶
Gespeicherte Prozeduren mit Eigentümerrechten unterliegen in einer Sitzung den folgenden Regeln:
Sie werden mit den Berechtigungen des Eigentümers ausgeführt, nicht mit den Berechtigungen des Aufrufers.
Tipp
Wenn Sie eine gespeicherte Prozedur mit Eigentümerrechten benötigen, um Aktionen auf einer Tabelle, einer Ansicht oder einer Funktion auszuführen, für die der Aufrufer die Zugriffsberechtigung hat, können Sie den Aufrufer eine Referenz auf diese Tabelle, Ansicht oder Funktion übergeben lassen.
Weitere Informationen dazu finden Sie unter Übergegen von Referenzen auf Tabellen, Ansichten, Funktionen und Abfragen an gespeicherte Prozeduren.
Sie übernehmen das aktuelle Warehouse des Aufrufers.
Sie verwenden die Datenbank und das Schema, in denen die gespeicherte Prozedur erstellt wurde, nicht die Datenbank und das Schema, die der Aufrufer aktuell verwendet.
Auf die meisten Aufrufer-spezifischen Informationen kann nicht zugegriffen werden. Beispiel:
Sitzungsvariablen des Aufrufers können nicht angezeigt, festgelegt oder aufgehoben werden.
Auflisten der Parameter mit SHOW PARAMETERS kann nicht ausgeführt werden.
Es kann nur eine Teilmenge der vom Aufrufer festgelegten Sitzungsparameter verwendet werden. So kann beispielsweise in SQL-Befehlen, die Datumswerte ausgeben, der DATE_OUTPUT_FORMAT-Parameter verwendet werden, der für die Sitzung des Aufrufers festgelegt ist.
Die Liste dieser Parameter finden Sie unter Erläuterungen zu den Auswirkungen der Sitzungsparameter eines Anrufers auf eine Prozedur mit Eigentümerrechten.
Sitzungsparameter des Aufrufers können weder festgelegt noch aufgehoben werden.
INFORMATION_SCHEMA-Tabellenfunktionen (z. B. AUTOMATIC_CLUSTERING_HISTORY), die Ergebnisse basierend auf dem aktuellen Benutzer zurückgeben, können nicht abgefragt werden.
Nicht-Eigentümern werden keine Informationen über die Prozedur aus der Ansicht PROCEDURES angezeigt.
Einschränkungen für Sitzungsvariablen und Sitzungsparameter werden nachstehend ausführlicher beschrieben.
Sitzungsvariablen für Prozeduren mit Eigentümerrechten¶
Eine gespeicherte Prozedur hat keinen Zugriff auf SQL-Variablen, die außerhalb der gespeicherten Prozedur erstellt wurden. Diese Einschränkung verhindert, dass eine gespeicherte Prozedur, die von einem Benutzer verfasst wurde oder deren Eigentümer ein Benutzer ist, SQL-Variablen liest, die von einem anderen Benutzer (dem Aufrufer der gespeicherten Prozedur) erstellt wurden.
Wenn die gespeicherte Prozedur Werte benötigt, die in SQL-Variablen der aktuellen Sitzung gespeichert sind, sollten die Werte in diesen Variablen als explizite Argumente an die gespeicherte Prozedur übergeben werden. Beispiel:
SET PROVINCE = 'Manitoba';
CALL MyProcedure($PROVINCE);
Erläuterungen zu den Auswirkungen der Sitzungsparameter eines Anrufers auf eine Prozedur mit Eigentümerrechten¶
Bemerkung
Dieser Abschnitt gilt nicht für den Befehl SHOW PARAMETERS. Der Befehl SHOW PARAMETERS ist in gespeicherten Prozeduren mit Eigentümerrechten nicht erlaubt.
Der Wert eines Sitzungsparameters kann das Verhalten von Befehlen und Funktionen beeinflussen. So verwenden beispielsweise Befehle, die Datumswerte ausgeben, das vom Sitzungsparameter DATE_OUTPUT_FORMAT festgelegte Format.
In der Sitzung eines Aufrufers kann der Aufrufer einen Sitzungsparameter setzen oder überschreiben. In einer gespeicherten Prozedur mit Aufruferrechten können Sitzungsparameter die Ausführung von Abfragen und Ausdrücken beeinflussen, die innerhalb der Prozedur ausgeführt werden. So wirkt sich beispielsweise der Parameter TIMESTAMP_OUTPUT_FORMAT auf das Ausgabeformat einer untergeordneten Abfrage wie select current_timestamp::string
aus.
Allerdings werden bei einer gespeicherten Prozedur mit Eigentümerrechten die aus der Sitzung des Aufrufers stammenden Werte nur für die folgenden Parameter verwendet:
AUTOCOMMIT
BINARY_INPUT_FORMAT
BINARY_OUTPUT_FORMAT
DATE_INPUT_FORMAT
DATE_OUTPUT_FORMAT
ENABLE_UNLOAD_PHYSICAL_TYPE_OPTIMIZATION
ERROR_ON_NONDETERMINISTIC_MERGE
ERROR_ON_NONDETERMINISTIC_UPDATE
JDBC_TREAT_DECIMAL_AS_INT
JSON_INDENT
LOCK_TIMEOUT
MAX_CONCURRENCY_LEVEL
ODBC_USE_CUSTOM_SQL_DATA_TYPES
PERIODIC_DATA_REKEYING
QUERY_TAG
QUERY_WAREHOUSE_NAME
ROWS_PER_RESULTSET
STATEMENT_QUEUED_TIMEOUT_IN_SECONDS
STATEMENT_TIMEOUT_IN_SECONDS
STRICT_JSON_OUTPUT
TIMESTAMP_DAY_IS_ALWAYS_24H
TIMESTAMP_INPUT_FORMAT
TIMESTAMP_LTZ_OUTPUT_FORMAT
TIMESTAMP_NTZ_OUTPUT_FORMAT
TIMESTAMP_OUTPUT_FORMAT
TIMESTAMP_TYPE_MAPPING
TIMESTAMP_TZ_OUTPUT_FORMAT
TIMEZONE
TIME_INPUT_FORMAT
TIME_OUTPUT_FORMAT
TRANSACTION_ABORT_ON_ERROR
TRANSACTION_DEFAULT_ISOLATION_LEVEL
TWO_DIGIT_CENTURY_START
UNSUPPORTED_DDL_ACTION
USE_CACHED_RESULT
WEEK_OF_YEAR_POLICY
WEEK_START
Bemerkung
Diese Liste kann sich im Laufe der Zeit ändern.
Bei anderen Parametern (oben nicht aufgeführt), gilt Folgendes:
Es wird der Kontoparameterwert des Eigentümers verwendet.
Wenn der Parameter auf Kontoebene für das Konto des Eigentümers nicht festgelegt ist, wird der Standardwert des Kontoparameters verwendet.
Diese Einschränkung dient dazu, potenzielle Probleme zu vermeiden, die auftreten könnten, wenn die gespeicherte Prozedur mit Eigentümerrechte die Sitzungsparameter des Aufrufers verwendet. Beispiel:
Wenn der Autor (Eigentümer) einer gespeicherten Prozedur einen bestimmten Sitzungsparameter festgelegt hat, dieser Parameter aber vom Aufrufer der gespeicherten Prozedur nicht gesetzt wird, kann die gespeicherte Prozedur fehlschlagen oder sich anders verhalten, wenn sie von anderen Benutzern als dem Autor aufgerufen wird.
Wenn eine gespeicherte Prozedur jeden Sitzungsparameter verwenden dürfte, könnte der Eigentümer einer gespeicherten Prozedur den Wert jedes vom Aufrufer festgelegten Sitzungsparameters erkennen.
Entfernen einiger Einschränkungen bei gespeicherten Prozeduren mit Eigentümerrechten¶
Für gespeicherte Prozeduren mit Eigentümerrechten gelten neben den Einschränkungen für Sitzungsvariablen und Sitzungsparameter mehrere zusätzliche Einschränkungen. Diese Einschränkungen beziehen sich auf Folgendes:
Die integrierten Funktionen, die innerhalb einer gespeicherten Prozedur aufgerufen werden können.
Möglichkeit, ALTER USER-Anweisungen auszuführen.
Überwachen gespeicherter Prozeduren zum Zeitpunkt der Ausführung.
Befehle SHOW und DESCRIBE.
Die Arten von SQL-Anweisungen, die innerhalb einer gespeicherten Prozedur aufgerufen werden können.
In den folgenden Abschnitten werden diese Einschränkungen ausführlicher erläutert:
Bemerkung
Die meisten Einschränkungen einer gespeicherten Prozedur mit Eigentümerrechten gelten für alle Aufrufer, einschließlich des Eigentümers.
Einschränkungen für integrierte Funktionen¶
Wenn eine gespeicherte Prozedur als gespeicherte Prozedur mit Eigentümerrechten erstellt wird, können Aufrufer, die keine Eigentümer sind, die folgenden integrierten Funktionen nicht aufrufen:
GET_DDL()
Dies verhindert, dass andere Benutzer als der Eigentümer der gespeicherten Prozedur den Quellcode der gespeicherten Prozedur einsehen können.
SYSTEM$ENABLE_BEHAVIOR_CHANGE_BUNDLE()
SYSTEM$DISABLE_BEHAVIOR_CHANGE_BUNDLE()
ALTER USER¶
Die folgenden Einschränkungen gelten für ALTER USER-Anweisungen in einer gespeicherten Prozedur mit Eigentümerrechten:
Gespeicherte Prozeduren mit Eigentümerrechten können keine ALTER USER-Anweisungen ausführen, die implizit den aktuellen Benutzer der Sitzung verwenden. (Gespeicherte Prozeduren mit Eigentümerrechten können allerdings ALTER USER-Anweisungen ausführen, die den Benutzer explizit identifizieren, solange der Benutzer nicht der aktuelle Benutzer ist.)
Überwachen gespeicherter Prozeduren zum Zeitpunkt der Ausführung¶
Weder Eigentümer noch Aufrufer einer gespeicherten Prozedur mit Eigentümerrechten verfügen notwendigerweise über Berechtigungen zum Überwachen der Ausführung der gespeicherten Prozedur.
Ein Benutzer mit der Berechtigung WAREHOUSE MONITOR kann die Ausführung der einzelnen Warehouse-bezogenen SQL-Anweisungen in dieser gespeicherten Prozedur überwachen. Die meisten Abfragen und DML-Anweisungen beziehen sich auf Warehouse-orientierte Anweisungen. DDL-Anweisungen wie CREATE, ALTER usw. nutzen das Warehouse nicht und können im Rahmen der Überwachung gespeicherter Prozeduren nicht überwacht werden.
Befehle SHOW und DESCRIBE¶
Eine gespeicherte Prozedur mit Eigentümerrechten verfügt nicht über die erforderlichen Berechtigungen, um Informationen über andere Benutzer als den Aufrufer zu lesen. Beispiel: Wenn Sie SHOW USERS LIKE <aktueller_Benutzer>
ausführen, werden Informationen zum aktuellen Benutzer angezeigt, aber der allgemeinere Befehl SHOW USERS
funktioniert nur, wenn der aktuelle Benutzer der einzige Benutzer ist.
Die folgenden SHOW-Befehle sind zulässig:
SHOW DATABASES
SHOW SCHEMAS
SHOW WAREHOUSES
Einschränkungen für SQL-Anweisungen¶
Obwohl gespeicherte Prozeduren mit Aufruferrechten jede SQL-Anweisung ausführen können, für die der Aufrufer über ausreichende Berechtigungen verfügt, um sie außerhalb einer gespeicherten Prozedur auszuführen, können gespeicherte Prozeduren mit Eigentümerrechten nur eine Teilmenge von SQL-Anweisungen aufrufen.
Die folgenden SQL-Anweisungen können aus der gespeicherten Prozedur mit Eigentümerrechten heraus aufgerufen werden:
SELECT
DML
DDL (Einschränkungen für die ALTER USER-Anweisung finden Sie oben.)
GRANT/REVOKE
Variablenzuordnung
DESCRIBE und SHOW (siehe oben dokumentierte Einschränkungen)
Andere SQL-Anweisungen können nicht aus der gespeicherten Prozedur mit Eigentümerrechten heraus aufgerufen werden.
Verschachtelte gespeicherte Prozeduren mit unterschiedlichen Rechten¶
Wenn eine gespeicherte Prozedur mit Eigentümerrechten von einer gespeicherten Prozedur mit Aufruferrechten aufgerufen wird oder umgekehrt, gelten die folgenden Regeln:
Eine gespeicherte Prozedur verhält sich wie eine gespeicherte Prozedur mit Aufruferrechten nur dann, wenn es sich bei der Prozedur und allen in der Aufrufhierarchie darüberliegenden Prozeduren um gespeicherte Prozeduren mit Aufruferrechten handelt.
Eine gespeicherte Prozedur mit Eigentümerrechten verhält sich stets wie eine gespeicherte Prozedur mit Eigentümerrechten, unabhängig davon, von wo aus sie aufgerufen wird.
Jede gespeicherte Prozedur, die direkt oder indirekt von einer gespeicherten Prozedur mit Eigentümerrechten aufgerufen wird, verhält sich wie eine gespeicherte Prozedur mit Eigentümerrechten.
Auswählen zwischen Eigentümerrechten und Aufruferrechten¶
Erstellen Sie eine gespeicherte Prozedur als gespeicherte Prozedur mit Eigentümerrechten, wenn alle der folgenden Bedingungen erfüllt sind:
Sie möchten eine Aufgabe bzw. Aufgaben an einen oder mehrere andere Benutzer delegieren, die mit den Berechtigungen des Eigentümers und nicht den Berechtigungen des Aufrufers ausgeführt werden sollen.
Wenn Sie beispielsweise möchten, dass ein Benutzer ohne DELETE-Berechtigung für eine Tabelle eine gespeicherte Prozedur aufrufen kann, mit der alte, aber nicht aktuelle Daten gelöscht werden, werden Sie wahrscheinlich eine gespeicherte Prozedur mit Eigentümerrechten verwenden. Diese Prozedur wird eine DELETE-Anweisung enthalten, die einen Filter (eine WHERE-Klausel) enthält, um zu steuern, welche Daten über den Filter gelöscht werden können.
Tipp
Wenn Sie eine gespeicherte Prozedur mit Eigentümerrechten benötigen, um Aktionen auf einer Tabelle, einer Ansicht oder einer Funktion auszuführen, für die der Aufrufer die Zugriffsberechtigung hat, können Sie den Aufrufer eine Referenz auf diese Tabelle, Ansicht oder Funktion übergeben lassen.
Weitere Informationen dazu finden Sie unter Übergegen von Referenzen auf Tabellen, Ansichten, Funktionen und Abfragen an gespeicherte Prozeduren.
Die Einschränkungen von gespeicherten Prozeduren mit Eigentümerrechten verhindern nicht, dass die gespeicherte Prozedur ordnungsgemäß funktioniert.
Erstellen Sie eine gespeicherte Prozedur als gespeicherte Prozedur mit Aufruferrechten, wenn Folgendes zutrifft:
Die gespeicherte Prozedur kann nur für Objekte verwendet werden, bei denen der Aufrufer der Eigentümer ist oder die erforderlichen Berechtigungen besitzt.
Die Einschränkungen von gespeicherten Prozeduren mit Eigentümerrechten würden verhindern, dass die gespeicherte Prozedur ordnungsgemäß funktioniert. Verwenden Sie beispielsweise eine Prozedur mit Aufruferrechten, wenn der Aufrufer in der gespeicherten Prozedur Informationen aus seiner Umgebung verwenden muss (z. B. Sitzungsvariablen oder Kontoparameter).
Wenn eine bestimmte Prozedur entweder mit den Rechten des Aufrufers oder mit den Rechten des Eigentümers ordnungsgemäß funktioniert, kann die folgende Regel Ihnen bei der Auswahl der zu verwendenden Rechte helfen:
Wenn es sich bei einer Prozedur um eine Prozedur mit Eigentümerrechten handelt, hat der Aufrufer keine Berechtigung zur Anzeige des Codes in der gespeicherten Prozedur (es sei denn, der Aufrufer ist gleichzeitig Eigentümer). Wenn Sie verhindern möchten, dass Aufrufer den Quellcode der Prozedur anzeigen, erstellen Sie die Prozedur als Prozedur mit Eigentümerrechten. Wenn Sie umgekehrt möchten, dass Aufrufer den Quellcode lesen können, erstellen Sie die Prozedur als Prozedur mit Aufruferrechten.