Schreibgeschützte Cloud SQL for PostgreSQL-Sitzungen erstellen

Sie können eine schreibgeschützte Cloud SQL for PostgreSQL-Sitzung mit dem Sitzungsparameter cloudsql_session_read_only erstellen. Dieser Ansatz ist eine robustere Methode, um Datenänderungen während einer Sitzung zu verhindern, als die standardmäßigen schreibgeschützten Optionen von PostgreSQL. Mit dem Parameter cloudsql_session_read_only können Sie die Sitzung vorübergehend oder dauerhaft für die Dauer der Sitzung schreibgeschützt machen. Sie können schreibgeschützte Sitzungen dieser Art verwenden, um die Datenintegrität in verschiedenen Kontexten zu schützen, z. B. in Sitzungen, in denen Sie MCP-Tools (Model Context Protocol), Berichts- und Audit-Tools verwenden.

Standardmäßig ist cloudsql_session_read_only auf off festgelegt, was die Datenänderung ermöglicht.

Was der schreibgeschützte Modus verhindert

In einer schreibgeschützten Sitzung kann die Datenbank keine Daten ändern. Im Lesemodus ist Folgendes nicht möglich:

  • Im Lesemodus können keine neuen Transaktions-IDs generiert werden. Es können keine schreibbaren Transaktionen gestartet werden. Daher können keine DML-Anweisungen (Data Manipulation Language, Datenbearbeitungssprache) oder DDL-Anweisungen (Data Definition Language, Datendefinitionssprache) ausgeführt werden. Wenn das Flag jedoch in der Mitte einer aktiven schreibbaren Transaktion festgelegt wird, können grundlegende DML- und DDL-Anweisungen bis zum Ende der Transaktion ausgeführt werden.

  • Im Lesemodus sind die folgenden Arten von Anweisungen und Aufrufen nicht möglich:

    • Aussagen wie VACUUM und NOTIFY.
    • Funktionen mit Nebeneffekten Das bedeutet, dass Sie keine FUNCTION aufrufen oder keine PROCEDURE ausführen können, die sowohl als VOLATILE als auch als LANGUAGE C oder LANGUAGE internal definiert ist, da für einige ihrer Nebeneffekte keine Transaktions-ID erforderlich ist. Beispiele sind pg_promote(), pg_cancel_backend() und pg_terminate_backend().
    • Fremddaten-Wrapper.
    • Alle Funktionen oder Prozeduren, die Sie in einer prozeduralen SQL-Sprache (PL) erstellt haben.

Schreibgeschützten Status konfigurieren

Während einer Cloud SQL for PostgreSQL-Sitzung können Sie mit der SET-Anweisung den Wert des cloudsql_session_read_only-Flags so ändern:

  • SET cloudsql_session_read_only = 'on'

    Mit dieser Anweisung wird die Sitzung schreibgeschützt. Solange das Flag auf on gesetzt ist, kann niemand Daten ändern. Wenn Sie die Daten später in der Sitzung wieder ändern möchten, ändern Sie den Wert zurück zu off:

  • SET cloudsql_session_read_only = 'off'

    Wenn Sie das Flag wieder auf off setzen, wird der Schreibzugriff in der Sitzung wiederhergestellt, es sei denn, das Flag ist auf locked gesetzt.

  • SET cloudsql_session_read_only = 'locked'

    Wenn Sie das Flag auf locked setzen, ist die Sitzung dauerhaft schreibgeschützt. Nachdem das Flag auf locked gesetzt wurde, können Sie es für die Dauer der Sitzung nicht mehr ändern.

Wenn Sie eine Sitzung sofort nach dem Herstellen der Verbindung zur Datenbank dauerhaft schreibgeschützt machen möchten, betten Sie das Flag cloudsql_session_read_only in den Verbindungsstring der Sitzung ein:

postgresql://USER:PASSWORD@HOST:PORT/DATABASE?options=-ccloudsql_session_read_only=locked

Ersetzen Sie die folgenden Werte:

  • USER ist der Name des Nutzers, der die Sitzung erstellt.
  • PASSWORD: Das Passwort des Nutzers.
  • HOST: die Host-URL.
  • PORT: die Portnummer.
  • DATABASE: Der Datenbankname.

Dieser Ansatz hat den zusätzlichen Vorteil, dass die Verbindung fehlschlägt, wenn Sie versuchen, eine Verbindung zu einer älteren Version von Cloud SQL herzustellen, die keine Unterstützung für schreibgeschützte Sitzungen bietet.

Sie können einem bestimmten Datenbanknutzer auch den Schreibzugriff für alle zukünftigen Verbindungen verweigern:

ALTER USER USERNAME SET cloudsql_session_read_only = 'locked';

Ersetzen Sie USERNAME durch den Nutzernamen des Nutzers, dessen Zugriff Sie auf „Nur lesen“ beschränken möchten.

Bestimmte Funktionen in schreibgeschützten Sitzungen aktivieren

  • Sie können die Verwendung einer bestimmten FUNCTION oder PROCEDURE aktivieren, die als VOLATILE und LANGUAGE C oder LANGUAGE internal definiert ist. Dazu hängen Sie ein SECURITY LABEL an die Funktion oder Prozedur an, die auf allow festgelegt ist.
  • Wenn Sie eine bestimmte Funktion in der Sitzung nicht zulassen möchten, legen Sie eine SECURITY LABEL-Anweisung auf deny fest.
  • Wenn Sie Funktionen auf die Zulassungsliste setzen möchten, die sich nicht auf den globalen Status auswirken, erstellen Sie eine vordefinierte Gruppe von Sicherheitslabels:

    CREATE EXTENSION "google_read_only_session"
    

    Die google_read_only_session-Erweiterung ermöglicht Folgendes:

    • Alle integrierten flüchtigen C-Funktionen, die für den schreibgeschützten Modus zulässig sind.
    • Alle Funktionen, die für den Lesemodus zulässig sind und aus Erweiterungen stammen, die in der Datenbank geladen wurden, einschließlich der Handlerfunktionen für die Sprachen pl/pgsql und pl/v8.

    Wenn Sie später eine oder mehrere neue Erweiterungen installieren, müssen Sie die google_read_only_session-Erweiterung löschen und neu erstellen, um Gruppenlabels anzuwenden:

    > DROP EXTENSION google_read_only_session;
    > CREATE EXTENSION google_read_only_session;
    

    Mit dem Befehl DROP werden keine vorhandenen Labels entfernt. Mit dem zweiten CREATE-Befehl werden nur Labels für die flüchtigen C-Funktionen in der neuen Erweiterung hinzugefügt.

Nächste Schritte