Detaillierte Erklärung der MySQL DEFINER-Verwendung

Detaillierte Erklärung der MySQL DEFINER-Verwendung

Vorwort:

Haben Sie beim Erstellen von Ansichten und Funktionen in der MySQL-Datenbank schon einmal auf die Definer-Option geachtet? Wenn nach der Migration von Ansichten oder Funktionen Fehler auftreten, können diese tatsächlich mit dem Definierer zusammenhängen. Dieser Artikel stellt hauptsächlich die Bedeutung und Funktion des Definers in MySQL vor.

1. Kurze Einführung in DEFINER

Betrachten wir am Beispiel von Ansichten die offizielle Basissyntax zum Erstellen von Ansichten:

ERSTELLEN
    [ODER ERSETZEN]
    [ALGORITHMUS = {UNDEFINED | MERGE | VERSUCHBAR}]
    [DEFINER = Benutzer]
    [SQL-SICHERHEIT { DEFINER | INVOKER }]
    VIEW Ansichtsname [(Spaltenliste)]
    Als Select-Anweisung
    [MIT PRÜFOPTION [KASKADIERT | LOKAL]]

Wenn wir uns die obige Syntax genau ansehen, können wir erkennen, dass „definer“ zweimal vorkommt, einmal in „DEFINER = user“ und einmal in der SQL SECURITY-Option, die auf „DEFINER“ oder „INVOKER“ gesetzt werden kann. Haben Sie die Funktion von „definer“ erraten?

Definer bedeutet ins Chinesische übersetzt „Definierer“. Wenn Sie in MySQL eine Ansicht, Funktion, gespeicherte Prozedur, einen Trigger oder ein Ereignis erstellen, können Sie die Option DEFINER = user angeben, die angibt, wer das Objekt definiert. Wenn sie nicht explizit angegeben wird, ist der Benutzer, der das Objekt erstellt, der Definierer.

Für Ansichten, Funktionen und gespeicherte Prozeduren können Sie auch das SQL SECURITY-Attribut angeben, dessen Wert DEFINER (Definierer) oder INVOKER (Aufrufer) sein kann, um anzugeben, wessen Berechtigungen während der Ausführung verwendet werden. DEFINER bedeutet, dass das Programm mit den Berechtigungen des Definierers ausgeführt wird, und INVOKER bedeutet, dass das Programm mit den Berechtigungen des Anrufers ausgeführt wird.

Standardmäßig ist das SQL SECURITY-Attribut DEFINER. Wenn der Wert DEFINER ist, muss der von DEFINER angegebene Definer-Benutzer in der Datenbank vorhanden sein und der Definer-Benutzer über die entsprechenden Betriebsberechtigungen und Berechtigungen für die referenzierten zugehörigen Objekte verfügen. Der Executor muss nur über die Aufrufberechtigung verfügen, um die Ausführung erfolgreich durchzuführen. Wenn das SQL SECURITY-Attribut INVOKER ist, kann die Ausführung nur erfolgreich sein, wenn der Ausführer über die Aufrufberechtigung und die Berechtigung der referenzierten zugehörigen Objekte verfügt.

Einfach ausgedrückt: Angenommen, eine Ansicht fragt drei Tabellen abc ab. Wenn das SQL SECURITY-Attribut dieser Ansicht DEFINER ist, benötigt Benutzer u bei der Abfrage dieser Ansicht nur die Abfrageberechtigung dieser Ansicht. Wenn das SQL SECURITY-Attribut dieser Ansicht INVOKER ist, muss Benutzer u über die Abfrageberechtigung dieser Ansicht und die Abfrageberechtigung der drei Tabellen abc verfügen. Das folgende Beispiel demonstriert dies im Detail:

# Erstellen Sie zwei Ansichten. Beide werden von testuser definiert. Die Abfrage bezieht sich auf die Tabelle test_tb. mysql> show grants for 'testuser'@'%';
+-------------------------------------------------------------------------------------------------------------------+
| Zuschüsse für testuser@% |
+-------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'Testbenutzer'@'%' |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, CREATE VIEW, SHOW VIEW AUF `testdb`.* AN 'Testbenutzer'@'%' |
+-------------------------------------------------------------------------------------------------------------------+
2 Zeilen im Satz (0,00 Sek.)

mysql> anzeigen, Ansicht erstellen, view_definer\G
*************************** 1. Reihe ***************************
                Ansicht: view_definer
         Ansicht erstellen: CREATE ALGORITHM=UNDEFINED DEFINER=`testuser`@`%` SQL SECURITY DEFINER VIEW `view_definer` AS select `test_tb`.`stu_id` AS `stu_id`,`test_tb`.`stu_name` AS `stu_name` from `test_tb`
Zeichensatzclient: utf8mb4
Sortierungsverbindung: utf8mb4_general_ci
1 Zeile im Satz (0,00 Sek.)

mysql> anzeigen, Ansicht erstellen, view_invoker\G
*************************** 1. Reihe ***************************
                Ansicht: view_invoker
         Ansicht erstellen: CREATE ALGORITHM=UNDEFINED DEFINER=`testuser`@`%` SQL SECURITY INVOKER VIEW `view_invoker` AS select `test_tb`.`stu_id` AS `stu_id`,`test_tb`.`stu_name` AS `stu_name` from `test_tb`
Zeichensatzclient: utf8mb4
Sortierungsverbindung: utf8mb4_general_ci
1 Zeile im Satz (0,00 Sek.)

# Gewähren Sie dem uview-Benutzer nur die Berechtigung, diese beiden Ansichten abzufragen, um den Abfragetest durchzuführen mysql> select user();
+-----------------+
| Benutzer() |
+-----------------+
| uview@localhost |
+-----------------+
1 Zeile im Satz (0,00 Sek.)

mysql> Berechtigungen anzeigen;
+--------------------------------------------------------+
| Zuschüsse für uview@% |
+--------------------------------------------------------+
| GRANT USAGE ON *.* TO 'uview'@'%' |
| GRANT SELECT ON `testdb`.`view_definer` TO 'uview'@'%' |
| GRANT SELECT ON `testdb`.`view_invoker` TO 'uview'@'%' |
+--------------------------------------------------------+
3 Zeilen im Satz (0,00 Sek.)

mysql> wähle * aus View_Definer;
+--------+----------+
| stu_id | stu_name |
+--------+----------+
| 1001 | von1 |
| 1002 | dfsfd |
| 1003 | fdgfg |
+--------+----------+
9 Zeilen im Satz (0,00 Sek.)

mysql> wähle * aus view_invoker;
FEHLER 1356 (HY000): Die Ansicht „testdb.view_invoker“ verweist auf ungültige Tabellen oder Spalten oder Funktionen, oder der Definierer/Aufrufer der Ansicht verfügt nicht über die erforderlichen Rechte, um diese zu verwenden.

# Das Ergebnis ist, dass die view_definer-Abfrage normal ist, die view_invoker-Abfrage jedoch nicht ausgeführt werden kann, da der uview-Benutzer nicht über die Abfrageberechtigung für die test_tb-Tabelle verfügt

Benutzerdefinierte Funktionen und gespeicherte Prozeduren sind ähnlich. Wenn das SQL SECURITY-Attribut INVOKER ist, muss der Aufrufer über Ausführungsberechtigungen und Berechtigungen für die referenzierten Objekte verfügen, um die Ausführung erfolgreich durchführen zu können.

2. Einige Anmerkungen

Ein zusätzlicher Wissenspunkt: Nur Benutzer mit der Berechtigung „Erstellen“ und der Berechtigung „SUPER“ können Objekte mit DEFINER = andere Benutzer erstellen. Beispielsweise kann das Root-Konto eine Ansicht mit DEFINER = Testbenutzer erstellen, der Testbenutzer kann jedoch nur dann eine Ansicht mit seinem eigenen DEFINER erstellen, wenn die Ansicht erstellt wurde.

Um die Rolle von DEFINER genauer zu verstehen, nehmen wir Ansichten als Beispiel, um einige Beispiele in Sonderfällen zu zeigen:

Angenommen, der Benutzer u1 existiert nicht. Sie können das Root-Konto verwenden, um eine Ansicht mit DEFINER = u1 zu erstellen. Wenn das SQL SECURITY-Attribut der Ansicht DEFINER ist, wird bei der Abfrage ein Fehler gemeldet, der angibt, dass der Benutzer nicht existiert. Wenn das SQL SECURITY-Attribut der Ansicht INVOKER ist, kann das Root-Konto die Ansicht normal abfragen.

Angenommen, der Benutzer u2 existiert, hat aber keine Berechtigung zum Abfragen der Tabelle a. Sie können das Root-Konto verwenden, um eine Ansicht mit DEFINER = u2 zum Abfragen der Tabelle a zu erstellen. Wenn das SQL SECURITY-Attribut der Ansicht DEFINER ist, wird während der Abfrage ein Fehler gemeldet, der auf eine fehlende Berechtigung hinweist. Wenn das SQL SECURITY-Attribut der Ansicht INVOKER ist, kann die Ansicht normal mit dem Root-Konto abgefragt werden. Beim Anmelden als Benutzer u2 wird beim Erstellen einer Ansicht zur Abfragetabelle a direkt ein Fehler wegen fehlender Berechtigungen gemeldet, d. h. die Ansicht zur Abfragetabelle a kann nicht erstellt werden, unabhängig vom SQL SECURITY-Attribut dieser Ansicht.

Ich weiß nicht, ob Sie nach dem Lesen der obigen Beispiele ein klareres Verständnis von DEFINER haben. Interessierte Studierende können es selbst testen. Aufgrund meiner täglichen Erfahrung möchte ich über die Vorsichtsmaßnahmen im Zusammenhang mit DEFINER sprechen:

  • Das SQL SECURITY-Attribut empfiehlt die Verwendung des Standard-DEFINER.
  • Es wird empfohlen, für Ansichten, Funktionen und gespeicherte Prozeduren innerhalb einer Bibliothek einen einheitlichen DEFINER-Benutzer zu verwenden.
  • Ändern oder löschen Sie den Datenbankbenutzer nicht ohne weiteres, da dieser Benutzer der Definierer verwandter Objekte sein könnte.
  • Wenn Sie die SQL SECURITY-Eigenschaft ändern möchten, testen Sie sie gründlich und machen Sie sich den Unterschied vor und nach der Änderung klar.
  • Achten Sie bei der Migration der Datenbank auf die definierenden Benutzer verwandter Objekte in der neuen Umgebung.
  • Bei der Migration der Datenbank empfiehlt es sich, zunächst entsprechende Benutzer in der neuen Umgebung anzulegen und Berechtigungen zu erteilen.

Zusammenfassen:

In diesem Artikel werden hauptsächlich die Kenntnisse im Zusammenhang mit DEFINER vorgestellt. Diese Kenntnisse treten hauptsächlich beim Erstellen von Ansichten, Funktionen, gespeicherten Prozeduren und anderen Objekten auf und werden normalerweise leicht übersehen. Dennoch sollte man auf diese Details achten und sich intensiver mit ihnen beschäftigen, um bei der praktischen Anwendung viele Fehler zu vermeiden.

Dies ist das Ende dieses Artikels über die detaillierte Verwendung von MySQL DEFINER. Weitere relevante MySQL DEFINER-Inhalte finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Verwendung und Vorsichtsmaßnahmen der Mysql-Sortierfunktion „row number()“
  • Lösung für Indexfehler, die durch implizite MySQL-Typkonvertierung verursacht werden
  • Eine kurze Diskussion darüber, ob zu viele MySQL-Datenabfragen OOM verursachen
  • Django erstellt MySQL Master-Slave, um eine Lese-/Schreibtrennung zu erreichen
  • Detaillierte Erläuterung der MySQL-Multitabellen-Joinabfrage
  • Ein Artikel, der Ihnen hilft, die Grundlagen der MySQL-Datenbank zu verstehen
  • Detaillierte Erklärung von Group By und Having in MySQL
  • Eine bequeme Möglichkeit, mehrere Datenquellen und Mysql-Datenbanken im Springboot-Backend zu konfigurieren
  • Detaillierte Verwendung der MySQL-Funktionen row_number() und over()

<<:  Beispiel einer DOM-Operationstabelle (DOM erstellt Tabelle)

>>:  Vue + Openlayer realisiert den Drag- und Rotationsverformungseffekt von Grafiken

Artikel empfehlen

Rendering-Funktion und JSX-Details

Inhaltsverzeichnis 1. Grundlagen 2. Knoten, Bäume...

Anfänger lernen einige HTML-Tags (2)

Verwandter Artikel: Anfänger lernen einige HTML-Ta...

Installations-Tutorial für virtuelle VMware-Maschinen unter Ubuntu 18.04

Installationsschritte 1. Erstellen Sie eine virtu...

Grundlegende Verwendung von benutzerdefinierten Anweisungen in Vue

Inhaltsverzeichnis Vorwort Text 1. Globale Regist...

Übersicht über MySQL-Statistiken

MySQL führt SQL durch den Prozess der SQL-Analyse...

Verwendung des MySQL-Stresstesttools Mysqlslap

1. MySQLs eigenes Stresstest-Tool Mysqlslap mysql...

Verwendung des Linux-Dateibefehls

1. Befehlseinführung Der Dateibefehl wird verwend...

Javascript Frontend Optimierungscode

Inhaltsverzeichnis Optimierung der if-Beurteilung...

Implementierungsschritte zur Kapselung von Komponenten basierend auf React

Inhaltsverzeichnis Vorwort Wie kapselt Antd Kompo...

So installieren Sie Nginx und konfigurieren mehrere Domänennamen

Nginx-Installation CentOS 6.x yum verfügt standar...

MySQL 5.6 Installationsschritte mit Bildern und Text

MySQL ist ein Open-Source-Verwaltungssystem für k...

So laden Sie das JAR-Paket über die Webseite auf Nexus hoch

Wie lädt man das JAR-Paket in ein privates Lager ...

Alibaba Cloud Centos7.3-Installation, MySQL5.7.18 RPM-Installations-Tutorial

Deinstallieren Sie MariaDB CentOS7 installiert st...