In diesem Dokument wird beschrieben, wie Sie parametrisierte sichere Ansichten in Cloud SQL for MySQL verwenden, mit denen Sie den Datenzugriff basierend auf anwendungsspezifischen benannten Parametern wie Anmeldedaten von Anwendungsnutzern einschränken können. Parametrisierte sichere Ansichten verbessern die Sicherheit und Zugriffssteuerung, indem sie die Funktionalität von MySQL-Ansichten erweitern. Diese Ansichten verringern auch die Risiken, die mit der Ausführung nicht vertrauenswürdiger Abfragen aus Anwendungen verbunden sind, da automatisch eine Reihe von Einschränkungen für jede ausgeführte Abfrage erzwungen werden.
Weitere Informationen finden Sie unter Parametrisierte sichere Ansichten in Cloud SQL.
Hinweis
In diesem Dokument wird davon ausgegangen, dass Sie bereits eine Cloud SQL for MySQL-Instanz erstellt haben.
Prüfen Sie, ob auf Ihrer Cloud SQL-Instanz MySQL 8.0.43 oder höher ausgeführt wird. Wenn auf Ihrer MySQL 8.0-Instanz eine frühere Nebenversion ausgeführt wird, können Sie ein Upgrade der Nebenversion durchführen.
Aktivieren Sie das Datenbank-Flag
cloudsql_parameterized_secure_viewfür Ihre Instanz.Für diese Flag-Änderung ist kein Neustart der Datenbank erforderlich. Weitere Informationen finden Sie unter Datenbank-Flags konfigurieren.
Parametrisierte sichere Ansicht erstellen
Führen Sie den DDL-Befehl CREATE VIEW aus, um eine parametrisierte sichere Ansicht zu erstellen.
Beispiel:
CREATE VIEW v_orders
AS SELECT * FROM orders
WHERE customer_id = @local_customer_id;
Verwenden Sie die folgende Syntax:
-- Create a view with a parameter using the WHERE clause CREATE VIEW VIEW_NAME AS SELECT * FROM TABLE_NAME WHERE CONDITION;
-- Create a view with a parameter using the HAVING clause CREATE VIEW VIEW_NAME AS SELECT * FROM TABLE_NAME WHERE CONDITION_1 -- row level security GROUP BY COLUMN_NAME HAVING CONDITION_2; -- grouping
-- Create a view with a parameter using the ON clause CREATE VIEW VIEW_NAME AS SELECT * FROM TABLE_NAME_1 JOIN TABLE_NAME_2 ON CONDITION_1 -- join criteria WHERE CONDITION_2; -- row level security
Ersetzen Sie Folgendes:
VIEW_NAME: der Name der parametrisierten sicheren AnsichtTABLE_NAMEoderTABLE_NAME_N: Der Name der Tabelle oder Tabellen, die in der parametrisierten Ansicht verwendet werden sollen.COLUMN_NAMEoderCOLUMN_NAME_N: der Name der Tabellenspalte(n), die in der parametrisierten Ansicht verwendet werden sollenCONDITIONoderCONDITION_N: Die Bedingungsanweisung(en), die im Rahmen einerWHERE-,ON- oderHAVING-Klausel ausgewertet werden sollen. Sie können die Sitzungsvariable angeben, die als Parameter verwendet wird, wenn Sie später eine Abfrage für die Ansicht ausführen. Eine Bedingung sieht so aus:WHERE customer_id = @local_customer_id
Sitzungsvariablen,
@variable_name, sind nur in denWHERE-,ON- oderHAVING-Klauseln einerCREATE VIEW-Anweisung zulässig.
Parametrisierte sichere Ansicht abfragen
Wenn Sie eine parametrisierte sichere Ansicht in Cloud SQL for MySQL abfragen möchten, haben Sie zwei Möglichkeiten:
Weisen Sie Variablen Werte zu, indem Sie den Hinweis
SET_VIEW_VARSverwenden, wenn Sie die parametrisierte sichere Ansicht abfragen. Wenn eine der Variablen, auf die in der Ansicht verwiesen wird, nicht festgelegt ist oder wenn in derSET_VIEW_VARS-Hinweisvariable nicht zugehörige Variablen enthalten sind, schlägt die Abfrage für die parametrisierte sichere Ansicht fehl.Rufen Sie die Prozedur
mysql.execute_parameterized_queryauf, um die parametrisierte sichere Ansicht abzufragen. Wenn Sie die Prozedurmysql.execute_parameterized_queryverwenden, geben Sie zwei Argumente an. Das erste Argument ist eine Abfrage für die parametrisierte sichere Ansicht ohne Hinweise zur Sitzungsvariable. Das zweite Argument enthält alle erforderlichen Sitzungsvariablen und die Werte, die Sie angeben möchten.
Hinweiswerte verwenden
So fragen Sie die parametrisierte sichere Ansicht mit dem Hinweis SET_VIEW_VARS ab:
-- Set the parameter and query SELECT /*+ SET_VIEW_VARS(SESSION_VARIABLE = VALUE) */ * FROM VIEW_NAME;
Ersetzen Sie Folgendes:
SESSION_VARIABLE: Der benannte Parameter der parametrisierten sicheren Ansicht, für den Sie unterschiedliche Werte angeben können. Sie definieren den Namen der Sitzungsvariablen, wenn Sie die Ansicht erstellen. Verwenden Sie dazu die@variable_name-Notation in der Ansichtsbedingungsklausel.VALUE: ein Wert für diesen benannten ParameterVIEW_NAME: Name der parametrisierten sicheren Ansicht
Beispiel:
SELECT /*+ SET_VIEW_VARS(local_customer_id = 12345) */ *
FROM v_orders;
Parametrisierte Abfrage verwenden
Verwenden Sie die folgende Syntax, um die parametrisierte sichere Ansicht mit der Prozedur mysql.execute_parameterized_query abzufragen:
CALL mysql.execute_parameterized_query( 'SELECT * FROM DATABASE_NAME.VIEW_NAME', 'SESSION_VARIABLE=VALUE');
Ersetzen Sie Folgendes:
SESSION_VARIABLE: Der benannte Parameter der parametrisierten sicheren Ansicht, für den Sie unterschiedliche Werte angeben können. Sie definieren den Namen der Sitzungsvariablen, wenn Sie die Ansicht erstellen. Verwenden Sie dazu die@variable_name-Notation in der Ansichtsbedingungsklausel.VALUE: ein Wert für diesen benannten ParameterDATABASE_NAME: Name der Datenbank der AnsichtVIEW_NAME: Name der parametrisierten sicheren Ansicht
Beispiel:
CALL mysql.execute_parameterized_query(
'SELECT * FROM db.v_orders',
'local_customer_id = 5, earliest_year = 2021');
Beschränkungen bei Abfragen
Im Folgenden finden Sie die eingeschränkten Vorgänge für Abfragen, die Sie mit den in Parametrisierte sichere Ansicht abfragen beschriebenen Optionen ausführen:
- Die Abfrage kann nur eine
SELECT-Anweisung sein. - Die Abfrage darf keine Aufrufe von benutzerdefinierten Funktionen oder gespeicherten Prozeduren enthalten.
- In der Abfrage können keine Variablen zugewiesen werden.
- Wenn Sie die
CALL mysql.execute_parameterized_query-Methode verwenden, darf die Abfrage nicht aus mehreren Anweisungen bestehen, die zu einer einzelnen Anweisung verkettet werden. Die AbfrageanweisungSELECT * FROM a; DROP TABLE a;ist beispielsweise ungültig.
Parametrisierte sichere Ansichten in Logs ansehen
Wenn Cloud SQL for MySQL-Datenbanknutzer versuchen, eine parametrisierte sichere Ansicht zu erstellen, wird im MySQL-Fehlerlog eine Meldung auf Informationsebene protokolliert, die der folgenden ähnelt:
User variables permitted in %s.%s through Parameterized Secure View feature
Fehlerbehebung bei parametrisierten sicheren Ansichten
| Problem | Fehlerbehebung |
|---|---|
Das Flag cloud_parameterized_secure_view ist für die Instanz nicht festgelegt.
|
Wenn das Flag cloudsql_parameterized_secure_view auf OFF gesetzt ist, führt jeder Versuch, eine vorhandene parametrisierte sichere Ansicht abzufragen, zu folgendem Fehler:
Wenn Sie versuchen, eine parametrisierte sichere Ansicht ohne festgelegtes Flag zu erstellen, wird der folgende Fehler angezeigt:
Sie können prüfen, ob die parametrisierten sicheren Ansichten für eine Cloud SQL-Instanz aktiviert sind, indem Sie die globale Variable prüfen: SHOW VARIABLES LIKE 'cloudsql_parameterized_secure_view'; |
Die Abfrage schlägt mit dem Fehler View's SELECT contains a variable or
parameter fehl. |
Variablen sind außerhalb von WHERE-, HAVING- oder ON-Klauseln nicht zulässig. Die Verwendung einer Variablen außerhalb dieser Klauseln führt zu einem Fehler. |
Abfrage schlägt mit dem Fehler User variable `%s` used in Parameterized Secure View %s
must be set in the query before using SET_VIEW_VARS hint fehl
|
Legen Sie die Sitzungsvariable fest, bevor Sie die Abfrage ausführen. |
| Abfrage schlägt mit einem MySQL-Versionsfehler fehl | Wenn Sie versuchen, eine vorhandene parametrisierte sichere Ansicht mit einer MySQL-Version vor 8.0.43 abzufragen, kann der folgende Fehler auftreten:
|