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 DEFINERBetrachten 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 AnmerkungenEin 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:
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:
|
<<: Beispiel einer DOM-Operationstabelle (DOM erstellt Tabelle)
>>: Vue + Openlayer realisiert den Drag- und Rotationsverformungseffekt von Grafiken
Inhaltsverzeichnis 1. Grundlagen 2. Knoten, Bäume...
Verwandter Artikel: Anfänger lernen einige HTML-Ta...
Installationsschritte 1. Erstellen Sie eine virtu...
Inhaltsverzeichnis Vorwort Text 1. Globale Regist...
1. Aufgetretene Probleme Bei der verteilten Proje...
MySQL führt SQL durch den Prozess der SQL-Analyse...
1. MySQLs eigenes Stresstest-Tool Mysqlslap mysql...
1. Befehlseinführung Der Dateibefehl wird verwend...
Inhaltsverzeichnis Optimierung der if-Beurteilung...
Inhaltsverzeichnis Vorwort Wie kapselt Antd Kompo...
Nginx-Installation CentOS 6.x yum verfügt standar...
MySQL ist ein Open-Source-Verwaltungssystem für k...
Wie lädt man das JAR-Paket in ein privates Lager ...
Deinstallieren Sie MariaDB CentOS7 installiert st...
Vorwort Jedes Mal, wenn Sie Docker verwenden, um ...