Bei der Verwendung einer MySQL-Datenbank treten häufig folgende Probleme auf: Die von anderen Benutzern definierte gespeicherte Prozedur kann von anderen Benutzern nicht geändert oder gelöscht werden. Normalerweise hat der Definierer der gespeicherten Prozedur die Berechtigung, diese zu ändern und zu löschen, andere Benutzer müssen jedoch über die entsprechende Berechtigung verfügen, da sie sie sonst nicht anzeigen oder aufrufen können. In MySQL erstellt Benutzer A eine gespeicherte Prozedur. Nun möchte ein anderer Benutzer B die von A erstellte gespeicherte Prozedur ändern. Basierend auf dieser Situation werden die folgenden Datensätze generiert. Berechtigungen des Benutzers A für die OTO3-Bibliothek: mysql> Berechtigungen für 'a'@'%' anzeigen; +---------------------------------------------------+ | Zuschüsse für a@% | +---------------------------------------------------+ | GRANT USAGE ON *.* TO 'a'@'%' | | GEWÄHREN SIE 'a'@'%' ALLE PRIVILEGIEN FÜR `OTO3`.* | +---------------------------------------------------+ 2 Zeilen im Satz (0,00 Sek.) Berechtigungen von Benutzer B: mysql> Berechtigungen für „swper“@„%“ anzeigen; +----------------------------------------------------------------------+ | Zuschüsse für swper@% | +----------------------------------------------------------------------+ | GRANT USAGE ON *.* AN 'swper'@'%' | | GRANT SELECT, UPDATE, DELETE, DROP, ALTER ON `OTO3`.* TO 'swper'@'%' | +----------------------------------------------------------------------+ 2 Zeilen im Satz (0,00 Sek.) Melden Sie sich bei MySQL als Benutzer B an; [root@mysql ~]# mysql -h10.0.10.110 -uswper -p123456 Beim Überprüfen der Liste der gespeicherten Prozeduren wird angezeigt, dass keine Berechtigung vorliegt: mysql> wähle „Name“ aus mysql.proc, wobei db = „OTO3“ und „Typ“ = „PROZEDUR“; FEHLER 1142 (42000): SELECT-Befehl für Benutzer „swper“@„mysql“ für Tabelle „proc“ verweigert Fügen Sie als Root dem Benutzer B die Berechtigung zum Anzeigen gespeicherter Prozeduren hinzu: mysql> gewähre 'swper'@'%' Auswahl auf mysql.proc; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) mysql> Berechtigungen für „swper“@„%“ anzeigen; +----------------------------------------------------------------------+ | Zuschüsse für swper@% | +----------------------------------------------------------------------+ | GRANT USAGE ON *.* AN 'swper'@'%' | | GRANT SELECT, UPDATE, DELETE, DROP, ALTER ON `OTO3`.* TO 'swper'@'%' | | GRANT SELECT ON `mysql`.`proc` TO 'swper'@'%' | +----------------------------------------------------------------------+ 3 Zeilen im Satz (0,00 Sek.) Gehen Sie zurück zu Benutzer B, um die Liste der gespeicherten Prozeduren anzuzeigen: mysql> wähle „Name“ aus mysql.proc, wobei db = „OTO3“ und „Typ“ = „PROZEDUR“; +------------------------+ | Name | +------------------------+ | Debuggen | +------------------------+ 1 Zeile im Satz (0,00 Sek.) Zu diesem Zeitpunkt wird eine zusätzliche MySQL-Datenbank gefunden, aber es sind nur Abfrageberechtigungen für mysql.proc verfügbar: mysql> Datenbanken anzeigen; +--------------------+ | Datenbank | +--------------------+ | Informationsschema | |OTO3| |mysql | +--------------------+ 3 Zeilen im Satz (0,00 Sek.) Es gibt nur eine Tabelle in der MySQL-Bibliothek: proc mysql> mysql verwenden mysql> Tabellen anzeigen; +-----------------+ | Tabellen_in_mysql | +-----------------+ |proc| +-----------------+ 1 Zeile im Satz (0,00 Sek.) Sie können auch die Details der gespeicherten Prozedur sehen: mysql> zeige Prozedur zum Erstellen von proc_cs\G *************************** 1. Reihe *************************** Prozedur: proc_cs SQL-Modus: STRICT_TRANS_TABLES, KEIN_AUTO_CREATE_USER, KEIN_ENGINE_SUBSTITUTION Prozedur erstellen: CREATE DEFINER=`a`@`%` PROCEDURE `proc_cs`() BEGINNEN Versuchen Sie, die Konfiguration der gespeicherten Prozedur zu ändern: mysql> ALTER PROCEDURE proc_cs ändert SQL-Daten SQL SECURITY INVOKER; FEHLER 1370 (42000): Befehl zum Ändern der Routine für Routine „OTO3.proc_cs“ dem Benutzer „b“@„%“ verweigert Um die Anzeige zu erleichtern, versuchen Sie, die gespeicherte Prozedur im Navicat-Tool zu ändern, und melden Sie beim Speichern das folgende Berechtigungsproblem:
Versuchen Sie, eine gespeicherte Prozedur hinzuzufügen und Berechtigungsinformationen zu melden:
Dies bedeutet, dass Benutzer B nicht die Berechtigung hat, die autorisierte gespeicherte Prozedur von OTO3 zu ändern. Versuchen Sie, die folgende gespeicherte Prozedur als Benutzer B aufzurufen:
Es liegt offensichtlich keine Lauferlaubnis vor. Versuchen Sie, die ursprüngliche benutzerdefinierte gespeicherte Prozedur a zu löschen. Die Berechtigungsinformationen werden ebenfalls wie folgt gemeldet:
Man sieht, dass Benutzer B gar nicht die Berechtigung hat, die gespeicherte Prozedur aufzurufen. Hier fügen wir zunächst die Ausführungsberechtigung hinzu: Fügen Sie als Nächstes eine Berechtigung zum Ausführen der gespeicherten Prozedur hinzu: mysql> gewähre Ausführung auf OTO3.* für 'b'@'%'; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) mysql> Berechtigungen für 'b'@'%' anzeigen; +----------------------------------------------------------------------------------+ | Zuschüsse für b@% | +----------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'b'@'%' | | GRANT SELECT, UPDATE, DELETE, DROP, ALTER, EXECUTE ON `OTO3`.* TO 'b'@'%' | | GRANT SELECT ON `mysql`.`proc` TO 'b'@'%' | +----------------------------------------------------------------------------------+ 3 Zeilen im Satz (0,00 Sek.) Führen Sie die gespeicherte Prozedur erneut aus und stellen Sie sicher, dass sie erfolgreich ist.
Fügen Sie dann die Berechtigung zum Erstellen und Hinzufügen gespeicherter Prozeduren hinzu: mysql> gewähre 'b'@'%' CREATE ROUTINE auf OTO3.*; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) mysql> Berechtigungen für 'b'@'%' anzeigen; +-----------------------------------------------------------------------------------------------+ | Zuschüsse für b@% | +-----------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'b'@'%' | | GRANT SELECT, UPDATE, DELETE, DROP, ALTER, EXECUTE, CREATE ROUTINE ON `OTO3`.* TO 'b'@'%' | | GRANT SELECT ON `mysql`.`proc` TO 'b'@'%' | +-----------------------------------------------------------------------------------------------+ 3 Zeilen im Satz (0,00 Sek.) Nachdem Sie die oben genannten Berechtigungen hinzugefügt haben, können Sie eine gespeicherte Prozedur erstellen. CREATE DEFINER=`b`@`%` PROZEDURE `aaaa`() BEGINNEN #Routinekörper kommt hier hin... SELECT * von mysql.user; ENDE Die von Ihnen erstellten können Sie jedoch nicht löschen.
Fügen Sie als nächstes eine Änderungsberechtigung hinzu, die auch gelöscht werden kann; mysql> Berechtigung zum Ändern von ROUTINE auf OTO3.* für 'b'@'%'; Abfrage OK, 0 Zeilen betroffen (0,01 Sek.) Benutzerberechtigungen anzeigen mysql> Berechtigungen für 'b'@'%' anzeigen; +-----------------------------------------------------------------------------------------------------------+ | Zuschüsse für b@% | +-----------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'b'@'%' | | GRANT SELECT, UPDATE, DELETE, DROP, ALTER, EXECUTE, CREATE ROUTINE, ALTER ROUTINE AUF `OTO3`.* TO 'b'@'%' | | GRANT SELECT ON `mysql`.`proc` TO 'b'@'%' | +-----------------------------------------------------------------------------------------------------------+ 3 Zeilen im Satz (0,00 Sek.) Nachdem Sie die oben genannte Berechtigung „ROUTINE ändern“ hinzugefügt haben, verfügen Sie über die Löschberechtigung für alle gespeicherten Prozeduren von OTO3 [Ihre eigenen definierten Prozeduren hinzufügen, löschen und ändern]. Sie können die von anderen definierten gespeicherten Prozeduren löschen, aber nicht ändern. Beim Ändern der von anderen definierten gespeicherten Prozeduren wird die folgende Eingabeaufforderung angezeigt:
Können Sie hier erklären, wo diese SUPER-Berechtigung ist? Durch die Überprüfung der Benutzerberechtigungen stellt sich heraus, dass hier: mysql> wähle * aus mysql.user, wobei Benutzer='b'\G *************************** 1. Reihe *************************** Gastgeber: % Benutzer: b Select_priv: N Insert_priv: N Update_priv: N Löschpriv: N Create_priv: N Drop_priv: N Reload_priv: N Shutdown_priv: N Prozesspriv: N File_priv: N Grant_priv: N Referenzen_priv: N Index_priv: N Alter_priv: N Show_db_priv: N Super_priv: N Create_tmp_table_priv: N Lock_tables_priv: N Execute_priv: N Repl_slave_priv: N Repl_client_priv: N Create_view_priv: N Show_view_priv: N Create_routine_priv: N Alter_routine_priv: N Create_user_priv: N Event_priv: N Trigger_priv: N Create_tablespace_priv: N SSL-Typ: ssl_chiffre: x509_issuer: x509_Betreff: max_fragen: 0 max_updates: 0 max_Verbindungen: 0 Max_Benutzerverbindungen: 0 plugin:mysql_native_password Authentifizierungszeichenfolge: *CCB4F88E945E0E14F9BEB093EB797BB0BDBFA175 password_expired: N Passwort zuletzt geändert: 06.03.2017 11:37:35 password_lifetime: NULL Konto gesperrt: Nein 1 Zeile im Satz (0,00 Sek.) Versuchen Sie, die SUPER-Berechtigung hinzuzufügen: mysql> gewähre SUPER auf OTO3.* an 'b'@'%'; FEHLER 1221 (HY000): Falsche Verwendung von DB GRANT und GLOBAL PRIVILEGES mysql> gewähre 'b'@'%' SUPER auf *.*; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) Diese Berechtigung kann für die angegebene Datenbank nicht ausgeführt werden, da SUPER eine globale Berechtigung für das gesamte MySQL ist. mysql> Berechtigungen für „swper“@„%“ anzeigen; +-----------------------------------------------------------------------------------------------------------+ | Zuschüsse für swper@% | +-----------------------------------------------------------------------------------------------------------+ | GRANT SUPER ON *.* TO 'swper'@'%' | | GRANT SELECT, UPDATE, DELETE, DROP, ALTER, EXECUTE, CREATE ROUTINE, ALTER ROUTINE ON `OTO3`.* TO 'swper'@'%' | | GRANT SELECT ON `mysql`.`proc` TO 'swper'@'%' | +-----------------------------------------------------------------------------------------------------------+ 3 Zeilen im Satz (0,00 Sek.) Wenn Sie es noch einmal überprüfen, werden Sie feststellen, dass sich Super_priv: Y geändert hat. Ändern Sie dann die von anderen definierte gespeicherte Prozedur. mysql> wähle * aus mysql.user, wobei Benutzer='b'\G Beim Überprüfen aller Datenbanken stellte ich fest, dass nur eine Proc-Tabelle in der MySQL-Datenbank Leseberechtigung hatte. SUPER war nicht so leistungsfähig, wie ich dachte. mysql> Datenbanken anzeigen; +--------------------+ | Datenbank | +--------------------+ | Informationsschema | |OTO3| |mysql | +--------------------+ 3 Zeilen im Satz (0,00 Sek.) Wenn Sie genau hinschauen, werden Sie die Ausführungsanweisung finden: mysql> wähle * aus mysql.user, wobei Benutzer='b'\G Wir können sehen, dass Create_routine_priv: N und Alter_routine_priv: N vorhanden sind. Diese beiden Berechtigungen sind offensichtlich Berechtigungen für gespeicherte Prozeduren. Können wir diese beiden Berechtigungen ohne SUPER verwenden? Fordern Sie diese SUPER-Berechtigung zurück; mysql> Super auf *.* von 'b'@'%' widerrufen; Abfrage OK, 0 Zeilen betroffen (0,01 Sek.) Alter_routine_priv, Create_routine_priv hinzufügen mysql> Berechtigung zum Ändern der Routine, Erstellen einer Routine auf *.* für 'b'@'%'; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) Berechtigungen von Benutzer B anzeigen mysql> Berechtigungen für 'b'@'%' anzeigen; +-----------------------------------------------------------------------------------------------------------+ | Zuschüsse für b@% | +-----------------------------------------------------------------------------------------------------------+ | GRANT CREATE ROUTINE, ALTER ROUTINE ON *.* TO 'b'@'%' | | GRANT SELECT, UPDATE, DELETE, DROP, ALTER, EXECUTE, CREATE ROUTINE, ALTER ROUTINE AUF `OTO3`.* TO 'b'@'%' | | GRANT SELECT ON `mysql`.`proc` TO 'b'@'%' | +-----------------------------------------------------------------------------------------------------------+ 3 Zeilen im Satz (0,00 Sek.) Es wurde festgestellt, dass immer noch dasselbe Berechtigungsproblem gemeldet wird:
Nachdem Sie die oben genannten Berechtigungen ausgeführt haben, können Sie andere Systembibliotheken sehen: [Beispielsweise verfügt die Sys-Bibliothek auch über gespeicherte Prozeduren, da diese beiden Berechtigungen global sind] mysql> Datenbanken anzeigen; +--------------------+ | Datenbank | +--------------------+ | Informationsschema | |OTO3| |mysql | | Leistungsschema | |System| | Prüfung | +--------------------+ 6 Zeilen im Satz (0,00 Sek.) Diese beiden Berechtigungen sind mächtiger. Sie können sogar gespeicherte Prozeduren in der Systembibliothek sys sehen, ändern und löschen, was sehr gefährlich ist. Wir haben uns entschieden, die Berechtigungen wieder zu widerrufen. Routine schaffen, Routine ändern; mysql> widerrufe Erstellungsroutine, ändere Routine auf *.* von 'b'@'%'; Es ist sicherer, das SUPER-Privileg zu verwenden. Aus den oben genannten Tests wurden folgende Schlussfolgerungen gezogen:
Kurz gesagt definiert Benutzer A eine gespeicherte Prozedur in der Datenbank OTO3. Nun möchte er Benutzer B verwenden, um die gespeicherte Prozedur auszuführen und zu ändern. Er muss Benutzer B die folgenden Berechtigungen hinzufügen: GRANT SELECT AUF MYSQL.PROC AUF „B“; GRANT EXECUTE, CREATE ROUTINE, ALTER ROUTINE AUF `OTO3`.* AUF 'B'; GRANT SUPER AUF *.* AUF ‚B‘; Die grundlegendsten Berechtigungen für Benutzer B sind also: mysql> Berechtigungen für 'b'@'%' anzeigen; +----------------------------------------------------------------------------------------+ | Zuschüsse für b@% | +----------------------------------------------------------------------------------------+ | GRANT SUPER ON *.* TO 'b'@'%' | | GRANT SELECT, ALTER, EXECUTE, CREATE ROUTINE, ALTER ROUTINE ON `OTO3`.* TO 'b'@'%' | | GRANT SELECT ON `mysql`.`proc` TO 'b'@'%' | +----------------------------------------------------------------------------------------+ 3 Zeilen im Satz (0,00 Sek.) An diesem Punkt ist es sehr klar, dass ein anderer Benutzer das Recht hat, die von anderen in MySQL definierten gespeicherten Prozeduren zu ändern. Wenn die gespeicherte Prozedur nicht als ein anderer Benutzer aufgerufen wird, können Sie Root-Berechtigungen verwenden, um den Definierer der gespeicherten Prozedur zu ändern. Dies entspricht dem Ändern der Berechtigungen des Eigentümers in Linux. Aktualisiere mysql.proc, setze DEFINER='b'@'%', wobei NAME='proc_cs' und db='OTO3'; Dies ist das Ende dieses Artikels über das Problem der Berechtigungen im Zusammenhang mit geänderten MySQL-gespeicherten Prozeduren. Weitere relevante Inhalte zu Berechtigungen für gespeicherte MySQL-Prozeduren 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:
|
<<: Zusammenfassung der Funktionsweise von JS auf Seiten innerhalb und außerhalb von Iframes
Die bidirektionale MySQL-Sicherung wird auch als ...
Die dekomprimierte Version von mysql5.7.18 starte...
Beim Konfigurieren des Domänennamens der Schnitts...
Inhaltsverzeichnis Erstellen von HTML-Seiten Impl...
Erstens: Stellen Sie zunächst sicher, dass die Ser...
Die Reihenfolge, in der Objekte Methoden aufrufen...
Das mobile Vue-Terminal bestimmt die Richtung, in...
Tomcat ist weithin als Webcontainer bekannt. Es h...
Grundlegende Verwendung <!DOCTYPE html> <...
Teil.0 Hintergrund Die Intranetserver des Unterne...
In diesem Artikel möchten wir eine Sammlung von 2...
Wie in der folgenden Abbildung dargestellt, ist e...
Inhaltsverzeichnis 1. Problembeschreibung 2. Prob...
Samba Übersicht Samba ist eine kostenlose Softwar...
Im vorherigen Artikel habe ich ein tabellenübergr...