SET ROLE
Ändern der Rolle der aktuellen Sitzung
DSQL
SET ROLE {role_name | NONE}
Parameter | Beschreibung |
---|---|
role_name |
Der Name der anzuwendenden Rolle role |
Die SET ROLE
-Anweisung ermöglicht es einem Benutzer, eine andere Rolle anzunehmen;es setzt die Kontextvariable CURRENT_ROLE
auf role_name, wenn diese Rolle dem CURRENT_USER
gewährt wurde.Für diese Sitzung erhält der Benutzer die von dieser Rolle gewährten Berechtigungen.Alle Rechte, die der vorherigen Rolle gewährt wurden, werden aus der Sitzung entfernt.Verwenden Sie NONE
anstelle von role_name, um die CURRENT_ROLE
zu löschen.
Wenn die angegebene Rolle nicht existiert oder dem Benutzer nicht explizit zugewiesen wurde, wird der Fehler “Role role_name is invalid or unavailable” ausgegeben.
SET ROLE
-BeispieleÄndern Sie die aktuelle Rolle in MANAGER
SET ROLE manager;
select current_role from rdb$database;
ROLE
=======================
MANAGER
Löschen Sie die aktuelle Rolle
SET ROLE NONE;
select current_role from rdb$database;
ROLE
=======================
NONE
SET TRUSTED ROLE
Ändert die Rolle der aktuellen Sitzung in die vertrauenswürdige Rolle
DSQL
SET TRUSTED ROLE
Die Anweisung SET TRUSTED ROLE
ermöglicht es, die dem Benutzer durch eine Mapping-Regel zugewiesene Rolle einzunehmen (siehe Mapping von Benutzern auf Objekte).Die durch eine Zuordnungsregel zugewiesene Rolle wird beim Verbinden automatisch übernommen, wenn der Benutzer keine explizite Rolle angegeben hat.Die Anweisung SET TRUSTED ROLE
ermöglicht es, die zugeordnete (oder trusted`
) Rolle zu einem späteren Zeitpunkt oder nach Änderung der aktuellen Rolle mit SET ROLE
wieder einzunehmen.
Eine vertrauenswürdige Rolle ist kein bestimmter Rollentyp, sondern kann eine beliebige Rolle sein, die mit CREATE ROLE
erstellt wurde, oder eine vordefinierte Systemrolle wie RDB$ADMIN
.Ein Anhang (Sitzung) hat eine vertrauenswürdige Rolle, wenn das Sicherheitsobjekt-Mapping-Subsystem eine Übereinstimmung zwischen dem vom Plugin übergebenen Authentifizierungsergebnis und einer lokalen oder globalen Zuordnung zu einer Rolle für die aktuelle Datenbank findet.Die Rolle kann diesem Benutzer nicht explizit zugewiesen werden.
Wenn eine Sitzung keine vertrauenswürdige Rolle hat, wird die Ausführung von SET TRUSTED ROLE
den Fehler „Your attachment has no trusted role
“ auslösen.
Note
|
Während die |
SET TRUSTED ROLE
-BeispieleAngenommen, eine Zuordnungsregel weist einem Benutzer "ALEX" die Rolle "ROLE1" zu:
CONNECT 'employee' USER ALEX PASSWORD 'password';
SELECT CURRENT_ROLE FROM RDB$DATABASE;
ROLE
===============================
ROLE1
SET ROLE ROLE2;
SELECT CURRENT_ROLE FROM RDB$DATABASE;
ROLE
===============================
ROLE2
SET TRUSTED ROLE;
SELECT CURRENT_ROLE FROM RDB$DATABASE;
ROLE
===============================
ROLE1
Statements for management of timeouts of the current connection.
SET SESSION IDLE TIMEOUT
Ändern des Sitzungsleerlauf-Timeouts
DSQL, PSQL
SET SESSION IDLE TIMEOUT value [<time-unit>] <time-unit> ::= MINUTE | HOUR | SECOND
Parameter | Beschreibung |
---|---|
value |
Die Zeitüberschreitungsdauer, ausgedrückt in time-unit.Ein Wert von '0' verschiebt die Zeitüberschreitung bei Verbindungsleerlauf, die für die Datenbank konfiguriert ist. |
time-unit |
Zeiteinheit des Timeouts.Standard ist |
Das SET SESSION IDLE TIMEOUT
setzt ein Leerlauf-Timeout auf Verbindungsebene und wird sofort wirksam.Die Anweisung kann außerhalb der Transaktionssteuerung (ohne aktive Transaktion) ausgeführt werden.
Das Festlegen eines value größer als für die Datenbank konfiguriert ist zulässig, wird aber effektiv ignoriert, siehe auch [fblangref40-management-session-timeout-effective-de].
Das aktuelle Zeitlimit für die Sitzung kann über RDB$GET_CONTEXT
, Namespace SYSTEM
und Variable SESSION_IDLE_TIMEOUT
abgerufen werden.Informationen sind auch von MON$ATTACHMENTS
erhältlich:
MON$IDLE_TIMEOUT
Leerlaufzeitüberschreitung auf Verbindungsebene in Sekunden;0
wenn Timeout nicht gesetzt ist.
MON$IDLE_TIMER
Ablaufzeit des Leerlauftimers;enthält NULL
, wenn kein Idle-Timeout gesetzt wurde oder kein Timer läuft.
Sowohl RDB$GET_CONTEXT('SYSTEM', 'SESSION_IDLE_TIMEOUT')
und MON$ATTACHMENTS.MON$IDLE_TIMEOUT
melden die für die Verbindung konfigurierte Leerlaufzeitüberschreitung;sie melden nicht die effektive Leerlaufzeitüberschreitung.
Das Sitzungsleerlauf-Timeout wird zurückgesetzt, wenn [fblangref40-management-session-reset-alter-de] ausgeführt wird.
Ein Timeout für eine Leerlaufsitzung ermöglicht, dass eine Nutzungsverbindung nach einer bestimmten Zeit der Inaktivität automatisch geschlossen wird.Ein Datenbankadministrator kann damit die Schließung alter Verbindungen erzwingen, die inaktiv geworden sind, um unnötigen Ressourcenverbrauch zu reduzieren.Es kann auch von Anwendungs- und Werkzeugentwicklern als Alternative zum Schreiben eigener Module zur Steuerung der Verbindungslebensdauer verwendet werden.
Standardmäßig ist die Leerlaufzeitüberschreitung nicht aktiviert.Es wird keine Mindest- oder Höchstgrenze festgelegt, aber ein angemessen langer Zeitraum – beispielsweise einige Stunden – wird empfohlen.
Wenn der Benutzer-API-Aufruf die Engine verlässt (zur aufrufenden Verbindung zurückkehrt), wird ein spezieller Leerlauf-Timer gestartet, der der aktuellen Verbindung zugeordnet ist
Wenn ein anderer Benutzer-API-Aufruf von dieser Verbindung in die Engine eingeht, wird der Leerlauf-Timer gestoppt und auf Null zurückgesetzt
Bei Überschreitung der maximalen Leerlaufzeit schließt die Engine die Verbindung sofort wie beim asynchronen Verbindungsabbau:
alle aktiven Anweisungen und Cursor sind geschlossen
alle aktiven Transaktionen werden zurückgesetzt
Die Netzwerkverbindung bleibt zu diesem Zeitpunkt geöffnet, sodass die Client-Anwendung den genauen Fehlercode beim nächsten API-Aufruf abrufen kann.Die Netzwerkverbindung wird serverseitig, nach einer Fehlermeldung oder zu gegebener Zeit durch einen Netzwerk-Timeout durch eine clientseitige Trennung geschlossen.
Note
|
Immer wenn eine Verbindung abgebrochen wird, gibt der nächste Benutzer-API-Aufruf den Fehler
zusätzlich zu
|
Note
|
Der Leerlauf-Timer startet nicht, wenn die Timeout-Periode auf Null gesetzt ist. |
Ein Timeout für eine Leerlaufsitzung kann eingestellt werden:
Auf Datenbankebene kann der Datenbankadministrator den Konfigurationsparameter ConnectionIdleTimeout
setzen, einen ganzzahligen Wert in Minuten.Der Standardwert Null bedeutet, dass kein Timeout festgelegt ist.Es ist pro Datenbank konfigurierbar, kann also global in firebird.conf
eingestellt und für einzelne Datenbanken in databases.conf
nach Bedarf überschrieben werden.
Der Geltungsbereich dieser Methode umfasst alle Benutzerverbindungen, außer Systemverbindungen (Garbage Collector, Cache Writer usw.).
Auf Verbindungsebene wird das Timeout der Leerlaufsitzung sowohl von der Anweisung SET SESSION IDLE TIMEOUT
als auch von der API (setIdleTimeout
) unterstützt.Der Umfang dieser Methode ist spezifisch für den mitgelieferten Anschluss (Aufsatz).Sein Wert in der API ist in Sekunden.In der SQL-Syntax können es Stunden, Minuten oder Sekunden sein.Der Geltungsbereich dieser Methode ist die Verbindung, auf die sie angewendet wird.
Note
|
Weitere Informationen zu den API-Aufrufen finden Sie in den Firebird 4.0 Release Notes. |
Der effektive Leerlauf-Timeout-Wert wird immer dann bestimmt, wenn ein Benutzer-API-Aufruf die Engine verlässt, wobei zuerst auf Verbindungsebene und dann auf Datenbankebene geprüft wird.Ein Timeout auf Verbindungsebene kann den Wert einer Einstellung auf Datenbankebene außer Kraft setzen, solange der Zeitraum für die Einstellung auf Verbindungsebene nicht länger als ein auf Datenbankebene anwendbares Timeout ungleich Null ist.
Important
|
Beachten Sie den Unterschied zwischen den Zeiteinheiten auf jeder Ebene.Auf Datenbankebene ist in den Konfigurationsdateien die Einheit für Absolute Genauigkeit ist in jedem Fall nicht garantiert, insbesondere bei hoher Systemlast, aber es wird garantiert, dass Timeouts nicht vor dem angegebenen Zeitpunkt ablaufen. |
SET STATEMENT TIMEOUT
Anweisungs-Timeout für eine Verbindung ändern
DSQL, PSQL
SET STATEMENT TIMEOUT value [<time-unit>] <time-unit> ::= SECOND | MILLISECOND | MINUTE | HOUR
Parameter | Beschreibung |
---|---|
value |
Die Zeitüberschreitungsdauer, ausgedrückt in time-unit.Ein Wert von |
time-unit |
Zeiteinheit des Timeouts.Standardmäßig ist |
Das SET SESSION IDLE TIMEOUT
setzt ein Leerlauf-Timeout auf Verbindungsebene und wird sofort wirksam.Die Anweisung kann außerhalb der Transaktionssteuerung (ohne aktive Transaktion) ausgeführt werden.
Das Setzen eines value größer als für die Datenbank konfiguriert ist zulässig, wird aber effektiv ignoriert, siehe auch [fblangref40-management-stmnt-timeout-effective-de].
Das aktuelle Statement-Timeout für die Sitzung kann über RDB$GET_CONTEXT
, Namespace SYSTEM
und Variable STATEMENT_TIMEOUT
abgerufen werden. Informationen sind auch von MON$ATTACHMENTS
erhältlich:
MON$STATEMENT_TIMEOUT
Zeitlimit für Anweisung auf Verbindungsebene in Millisekunden;0
wenn Timeout nicht gesetzt ist.
In MON$STATEMENTS
:
MON$STATEMENT_TIMEOUT
Anweisungs-Timeout auf Anweisungsebene in Millisekunden;0
wenn Timeout nicht gesetzt ist.
MON$STATEMENT_TIMER
Ablaufzeit des Timeout-Timers;enthält NULL
, wenn kein Idle-Timeout gesetzt wurde oder kein Timer läuft.
Sowohl RDB$GET_CONTEXT('SYSTEM', 'SESSION_IDLE_TIMEOUT')
und MON$ATTACHMENTS.MON$IDLE_TIMEOUT
melden die für die Verbindung konfigurierte Leerlaufzeitüberschreitung und MON$STATEMENTS$STATEMENT_TIMEOUT
für die Anweisung;sie melden nicht das effektive Zeitlimit für die Anweisung.
Der Anweisungs-Timeout wird zurückgesetzt, wenn [fblangref40-management-session-reset-alter-de] ausgeführt wird.
Die Anweisungs-Timeout-Funktion ermöglicht es, die Ausführung einer Anweisung automatisch zu stoppen, wenn sie länger als ein vorgegebener Timeout-Zeitraum ausgeführt wurde.Es gibt dem Datenbankadministrator ein Instrument zur Begrenzung des übermäßigen Ressourcenverbrauchs durch umfangreiche Abfragen.
Anweisungs-Timeouts können auch für Anwendungsentwickler hilfreich sein, wenn sie komplexe Abfragen erstellen und debuggen, ohne die Ausführungszeit im Voraus zu kennen.Tester und andere könnten sie nützlich finden, um Abfragen mit langer Laufzeit zu erkennen und endliche Laufzeiten für Testsuiten festzulegen.
Wenn die Anweisung mit der Ausführung beginnt oder ein Cursor geöffnet wird, startet die Engine einen speziellen Timer.Sie wird gestoppt, wenn die Ausführung der Anweisung abgeschlossen ist oder der letzte Datensatz vom Cursor abgerufen wurde.
Note
|
Ein Abruf setzt diesen Timer nicht zurück. |
Wenn der Timeout-Punkt erreicht ist:
Wenn die Anweisungsausführung aktiv ist, stoppt sie zum nächstmöglichen Zeitpunkt
Wenn die Anweisung derzeit nicht aktiv ist (z. B. zwischen Abrufen), wird sie als abgebrochen markiert und der nächste Abruf unterbricht tatsächlich die Ausführung und gibt einen Fehler zurück
Note
|
Anweisungstypen von Timeouts ausgeschlossen
Anweisungs-Timeouts gelten nicht für einige Anweisungstypen und werden einfach ignoriert:
|
Note
|
Der Timer startet nicht, wenn die Timeout-Periode auf Null gesetzt ist. |
Ein Anweisungs-Timeout kann eingestellt werden:
auf Datenbankebene durch den Datenbankadministrator durch Setzen des Konfigurationsparameters StatementTimeout
in firebird.conf
oder databases.conf
.StatementTimeout
ist eine Ganzzahl, die die Anzahl der Sekunden angibt, nach denen die Ausführung der Anweisung automatisch von der Engine abgebrochen wird.Null bedeutet, dass kein Timeout eingestellt ist.Eine Einstellung ungleich Null wirkt sich auf alle Anweisungen in allen Verbindungen aus.
auf Verbindungsebene mit SET STATEMENT TIMEOUT
oder der API zum Setzen eines Anweisungs-Timeouts (setStatementTimeout
).Eine Einstellung auf Verbindungsebene (über SQL oder die API) wirkt sich auf alle Anweisungen für die angegebene Verbindung aus;Einheiten für die Timeout-Periode auf dieser Ebene können mit beliebiger Granularität von Stunden bis Millisekunden angegeben werden.
auf Anweisungsebene unter Verwendung der API in Millisekunden
Der gültige Anweisungs-Timeout-Wert wird immer dann bestimmt, wenn eine Anweisung ausgeführt wird oder ein Cursor geöffnet wird.Bei der Suche nach dem wirksamen Timeout durchläuft die Engine die Ebenen, von der Anweisung bis zur Datenbank- und/oder globalen Ebene, bis sie einen Wert ungleich Null findet.Wenn sich herausstellt, dass der gültige Wert null ist, läuft kein Anweisungstimer und es gilt kein Timeout.
Ein Timeout auf Anweisungs- oder Verbindungsebene kann den Wert einer Einstellung auf Datenbankebene außer Kraft setzen, solange der Zeitraum für die Einstellung auf niedrigerer Ebene nicht länger als ein auf Datenbankebene anwendbares Timeout ungleich Null ist.
Important
|
Beachten Sie den Unterschied zwischen den Zeiteinheiten auf jeder Ebene.Auf Datenbankebene in der conf-Datei ist die Einheit für Absolute Genauigkeit ist in jedem Fall nicht garantiert, insbesondere bei hoher Systemlast, aber es wird garantiert, dass Timeouts nicht vor dem angegebenen Zeitpunkt ablaufen. |
Immer wenn eine Anweisung das Zeitlimit überschreitet und abgebrochen wird, gibt der nächste Benutzer-API-Aufruf den Fehler "isc_cancelled" mit einem sekundären Fehler zurück, der den genauen Grund angibt, d. h.
isc_cfg_stmt_timeout
Zeitüberschreitung auf Konfigurationsebene abgelaufen
isc_att_stmt_timeout
Zeitüberschreitung auf Attachmentebene abgelaufen
isc_req_stmt_timeout
Zeitüberschreitung auf Anweisungsebene abgelaufen
Note
|
Hinweise zu Anweisungs-Timeouts
|
Anweisungen zur Verwaltung von Zeitzonenfunktionen der aktuellen Verbindungen.
SET TIME ZONE
Ändern der Sitzungszeitzone
DSQL, PSQL
SET TIME ZONE { time_zone_string | LOCAL }
Ändert die Sitzungszeitzone in die angegebene Zeitzone.Die Angabe von LOCAL
wird auf die anfängliche Sitzungszeitzone der Sitzung zurückgesetzt (entweder die Standardeinstellung oder wie durch die Verbindungseigenschaft isc_dpb_session_time_zone
angegeben).
Die Ausführung von [fblangref40-management-session-reset-alter-de] hat dieselbe Auswirkung auf die Sitzungszeitzone wie SET TIME ZONE LOCAL
, setzt aber auch andere Sitzungseigenschaften zurück.
SET TIME ZONE
-Beispieleset time zone '-02:00';
set time zone 'America/Sao_Paulo';
set time zone local;
ALTER SESSION RESET
Sitzungsstatus auf die Anfangswerte zurücksetzen
DSQL, PSQL
ALTER SESSION RESET
ALTER SESSION RESET
setzt die aktuelle Benutzersitzung in ihren Anfangszustand zurück.Dies kann nützlich sein, um die Verbindung durch eine Clientanwendung (z. B. durch einen clientseitigen Verbindungspool) wiederzuverwenden.Wenn diese Anweisung ausgeführt wird, werden alle Benutzerkontextvariablen gelöscht, der Inhalt globaler temporärer Tabellen wird gelöscht und alle Einstellungen auf Sitzungsebene werden auf ihre Anfangswerte zurückgesetzt.
Es ist möglich, ALTER SESSION RESET
ohne Transaktion auszuführen.
Die Ausführung von ALTER SESSION RESET
führt die folgenden Schritte aus:
Der Fehler isc_ses_reset_err (335545206
) wird ausgelöst, wenn eine andere Transaktion in der aktuellen Sitzung aktiv ist als die aktuelle Transaktion (diejenige, die ALTER SESSION RESET
ausführt) und zweiphasige Transaktionen im vorbereiteten Zustand.
Systemvariable RESETTING
wird auf TRUE gesetzt.
ON DISCONNECT
Datenbank-Trigger werden ausgelöst, falls vorhanden und wenn Datenbank-Trigger für die aktuelle Verbindung nicht deaktiviert sind.
Die aktuelle Transaktion (diejenige, die ALTER SESSION RESET
ausführt), falls vorhanden, wird zurückgesetzt.Eine Warnung wird gemeldet, wenn diese Transaktion Daten vor dem Zurücksetzen der Sitzung geändert hat.
Die Sitzungskonfiguration wird auf ihre Anfangswerte zurückgesetzt.Dies beinhaltet, ist aber nicht beschränkt auf:
DECFLOAT
-Parameter (TRAP
und ROUND
) und Zurücksetzen auf die Anfangswerte, die mit dem DPB zur Verbindungszeit definiert wurden, oder ansonsten auf den Systemstandard.
Sitzungs- und Anweisungs-Timeouts werden auf Null zurückgesetzt.
Die aktuelle Rolle wird zum Verbindungszeitpunkt auf den Anfangswert zurückgesetzt, der mit DPB definiert wurde, und - wenn die Rolle geändert wird - wird der Cache der Sicherheitsklassen gelöscht.
Die Sitzungszeitzone wird auf den Anfangswert zurückgesetzt, der mit dem DPB zur Verbindungszeit definiert wurde, oder ansonsten auf den Systemstandard.
Die Bindungskonfiguration wird auf den Anfangswert zurückgesetzt, der mit dem DPB zur Verbindungszeit definiert wurde, oder ansonsten auf den Datenbank- oder Systemstandard.
Im Allgemeinen sollten Konfigurationswerte auf die Werte zurückgesetzt werden, die mit DPB zur Verbindungszeit konfiguriert wurden, oder ansonsten auf den Datenbank- oder Systemstandard.
Für den Namespace USER_SESSION
definierte Kontextvariablen werden entfernt.
Globale temporäre Tabellen, die als ON COMMIT PRESERVE ROWS
definiert sind, werden abgeschnitten (ihr Inhalt wird gelöscht).
ON CONNECT
-Datenbank-Trigger werden ausgelöst, falls vorhanden und wenn Datenbank-Trigger für die aktuelle Verbindung nicht deaktiviert sind.
Eine neue Transaktion wird implizit mit denselben Parametern gestartet wie die Transaktion, die zurückgesetzt wurde (sofern eine Transaktion vorhanden war)
Die Systemvariable RESETTING
wird auf FALSE gesetzt.
Note
|
|
Jeder Fehler, der durch ON DISCONNECT
-Trigger ausgelöst wird, bricht das Zurücksetzen der Sitzung ab und lässt den Sitzungsstatus unverändert.Solche Fehler werden mit dem primären Fehlercode isc_session_reset_err (335545206
) und dem Fehlertext "Cannot reset user session" gemeldet.
Jeder Fehler, der nach ON DISCONNECT
-Triggern ausgelöst wird (einschließlich der durch ON CONNECT
-Trigger ausgelösten), bricht sowohl das Zurücksetzen der Sitzung als auch die Verbindung selbst ab.Solche Fehler werden mit dem primären Fehlercode isc_ses_reset_failed (335545272
) und dem Fehlertext "Reset of user session failed. Connection is shut down." gemeldet.Nachfolgende Operationen auf der Verbindung (außer Trennen) schlagen mit dem Fehler isc_att_shutdown (335544856
) fehl.
SET DEBUG OPTION
Setting debug options
DSQL, PSQL
Firebird 4.0.1
SET DEBUG OPTION option-name = value
Optionsname | Datentyp | Beschreibung |
---|---|---|
|
|
Speichert Statement BLR zum Abrufen mit |
SET DEBUG OPTION
konfiguriert Debug-Informationen für die aktuelle Verbindung.
Warning
|
Debug-Optionen sind eng mit den Engine-Internals verbunden, und von ihrer Verwendung wird abgeraten, wenn Sie nicht genau verstehen, wie diese Internals von Version zu Version geändert werden können. |