Das MySQL-Berechtigungssystem stellt sicher, dass alle Benutzer nur diejenigen Operationen ausführen können, die sie auch ausführen dürfen. Wenn Sie als Benutzer eine Verbindung mit einem MySQL-Server herstellen, dann wird Ihre Identität über den Host, von dem aus Sie die Verbindung herstellen, und den angegebenen Benutzernamen bestimmt. Wenn Sie nach Herstellung der Verbindung Abfragen absetzen, gewährt das System Berechtigungen entsprechend Ihrer Identität und dem, was Sie tun wollen.
        MySQL berücksichtigt bei der Identifizierung sowohl Ihren Host-
        als auch Ihren Benutzernamen, da es wenig Grund zu der Annahme
        gibt, dass ein bestimmter Benutzername überall im Internet
        jeweils derselben Person zuzuordnen ist. So muss beispielsweise
        der Benutzer joe, der eine Verbindung von
        office.example.com aus herstellt, keineswegs
        mit dem Benutzer joe identisch sein, der
        seine Verbindung von home.example.com aus
        aufbaut. MySQL löst diese Diskrepanz, indem es Ihnen gestattet,
        zwischen Benutzern auf unterschiedlichen Hosts zu unterscheiden,
        die zufällig den gleichen Namen haben: Sie können einen Satz
        mit Berechtigungen für Verbindungen von joe
        auf office.example.com und einen anderen
        Berechtigungssatz für Verbindungen von joe
        auf home.example.com gewähren.
      
Die MySQL-Zugriffssteuerung umfasst zwei Stufen, wenn Sie ein Clientprogramm ausführen, das eine Verbindung mit dem Server herstellt:
Stufe 1: Der Server überprüft, ob er Ihnen die Verbindungsherstellung gestattet.
            Stufe 2: Sofern Sie eine Verbindung herstellen konnten,
            überprüft der Server nun jede von Ihnen abgesetzte
            Anweisung, um zu ermitteln, ob Sie ausreichende
            Berechtigungen für deren Durchführung genießen. Versuchen
            Sie beispielsweise, Datensätze aus einer Tabelle in einer
            Datenbank auszuwählen oder eine Tabelle aus der Datenbank
            zu löschen, dann vergewissert sich der Server, dass Sie die
            Berechtigung SELECT für die Tabelle bzw.
            die Berechtigung DROP für die Datenbank
            haben.
          
Werden Ihre Berechtigungen (sei es von Ihnen selbst oder jemandem anderes) geändert, während Sie eine Verbindung haben, dann haben diese Änderungen nicht unbedingt sofort für die nächste abgesetzte Anweisung Gültigkeit. Weitere Informationen finden Sie in Abschnitt 5.8.7, „Wann Berechtigungsänderungen wirksam werden“.
        Der Server speichert Berechtigungsinformationen in den
        Grant-Tabellen der mysql-Datenbank (d. h. in
        der Datenbank namens mysql). Der MySQL-Server
        liest die Inhalte dieser Tabellen beim Start in den Speicher
        ein. Unter den in Abschnitt 5.8.7, „Wann Berechtigungsänderungen wirksam werden“,
        beschriebenen Umständen erfolgt zudem ein Neueinlesen der
        Inhalte. Entscheidungen der Zugriffssteuerung basieren auf den
        im Arbeitsspeicher vorhandenen Kopien der Grant-Tabellen.
      
        Normalerweise manipulieren Sie die Inhalte der Grant-Tabellen
        indirekt, indem Sie mit Anweisungen wie GRANT
        oder REVOKE Konten einrichten und die
        Berechtigungen für jedes einzelne Konto steuern. Siehe auch
        Abschnitt 13.5.1, „Anweisungen zur Benutzerkontenverwaltung“. Die nachfolgende
        Beschreibung erläutert die den Grant-Tabellen zugrundeliegende
        Struktur und die Frage, wie der Server die Inhalte dieser
        Tabellen für die Interaktion mit Clients verwendet.
      
        Der Server benutzt die Tabellen user,
        db und host in der
        Datenbank mysql für beide Stufen der
        Zugriffssteuerung. Die Spalten in den Tabellen
        user und db sind
        nachfolgend aufgeführt. Die Tabelle host
        ähnelt der Tabelle db, weist aber einen
        speziellen Einsatzbereich auf, der in
        Abschnitt 5.8.6, „Zugriffskontrolle, Phase 2: Anfrageüberprüfung“, beschrieben wird.
      
| Tabellenname | user | db | 
| Spalten für Gültigkeitsbereiche | Host | Host | 
| User | Db | |
| Password | User | |
| Berechtigungsspalten | Select_priv | Select_priv | 
| Insert_priv | Insert_priv | |
| Update_priv | Update_priv | |
| Delete_priv | Delete_priv | |
| Index_priv | Index_priv | |
| Alter_priv | Alter_priv | |
| Create_priv | Create_priv | |
| Drop_priv | Drop_priv | |
| Grant_priv | Grant_priv | |
| Create_view_priv | Create_view_priv | |
| Show_view_priv | Show_view_priv | |
| Create_routine_priv | Create_routine_priv | |
| Alter_routine_priv | Alter_routine_priv | |
| Execute_priv | Execute_priv | |
| Trigger_priv | Trigger_priv | |
| Event_priv | Event_priv | |
| Create_tmp_table_priv | Create_tmp_table_priv | |
| Lock_tables_priv | Lock_tables_priv | |
| References_priv | References_priv | |
| Reload_priv | ||
| Shutdown_priv | ||
| Process_priv | ||
| File_priv | ||
| Show_db_priv | ||
| Super_priv | ||
| Repl_slave_priv | ||
| Repl_client_priv | ||
| Sicherheitsspalten | ssl_type | |
| ssl_cipher | ||
| x509_issuer | ||
| x509_subject | ||
| Spalten zur Ressourcensteuerung | max_questions | |
| max_updates | ||
| max_connections | ||
| max_user_connections | 
        Die Spalten Event_priv und
        Trigger_priv wurden in MySQL 5.1.6
        hinzugefügt.
      
        Während der zweiten Stufe der Zugriffssteuerung führt der
        Server eine Anforderungsverifizierung durch, um sicherzustellen,
        dass jeder Client über die erforderlichen Berechtigungen für
        jede abgesetzt Anforderung verfügt. Neben den Grant-Tabellen
        user, db und
        host kann der Server auch die Tabellen
        tables_priv und
        columns_priv für Anforderungen abfragen, die
        Tabellen betreffen. Die Tabellen tables_priv
        und columns_priv ermöglichen eine feiner
        abgestufte Berechtigungssteuerung auf der Tabellen- und
        Spaltenebene. Die Tabellen haben die folgenden Spalten:
      
| Tabellenname | tables_priv | columns_priv | 
| Spalten für Gültigkeitsbereiche | Host | Host | 
| Db | Db | |
| User | User | |
| Table_name | Table_name | |
| Column_name | ||
| Berechtigungsspalten | Table_priv | Column_priv | 
| Column_priv | ||
| Weitere Spalten | Timestamp | Timestamp | 
| Grantor | 
        Die Spalten Timestamp und
        Grantor werden derzeit nicht benutzt und
        sollen deswegen an dieser Stelle nicht weiter behandelt werden.
      
        Zur Verifizierung von Anforderungen, die gespeicherte Routinen
        betreffen, kann der Server auch die Tabelle
        procs_priv abfragen. Diese Tabelle weist die
        folgenden Spalten auf:
      
| Tabellenname | procs_priv | 
| Spalten für Gültigkeitsbereiche | Host | 
| Db | |
| User | |
| Routine_name | |
| Routine_type | |
| Berechtigungsspalten | Proc_priv | 
| Weitere Spalten | Timestamp | 
| Grantor | 
        Die Spalte Routine_type ist eine
        ENUM-Spalte, die mit den Werten
        'FUNCTION' bzw.
        'PROCEDURE' den Typ der Routine angibt, auf
        die sich der Datensatz bezieht. Diese Spalte gestattet die
        separate Gewährung von Berechtigungen für eine Funktion oder
        Prozedur gleichen Namens.
      
        Die Spalten Timestamp und
        Grantor werden derzeit nicht benutzt und
        sollen deswegen an dieser Stelle nicht weiter behandelt werden.
      
Jede Grant-Tabelle enthält Gültigkeitsbereichs- und Berechtigungsspalten:
            Bereichsspalten bestimmen den Gültigkeitsbereich aller
            Datensätze in den Tabellen, d. h. den Kontext, in dem der
            Datensatz gültig ist. So würde beispielsweise eine Tabelle
            user mit den Host- und
            User-Werten
            'thomas.loc.gov' bzw.
            'bob' zur Authentifizierung von
            Verbindungen verwendet, die vom Host
            thomas.loc.gov aus durch einen Client,
            der den Benutzernamen bob angibt,
            hergestellt würden. Ähnlich würde ein Datensatz in der
            Tabelle db mit den Werten
            'thomas.loc.gov',
            'bob' und 'reports' in
            den Spalten Host, User
            und Db verwendet werden, wenn der
            Benutzer bob vom Host
            thomas.loc.gov aus auf die Datenbank
            reports zuzugreifen versucht. Die
            Tabellen tables_priv und
            columns_priv enthalten
            Gültigkeitsbereichsspalten, die die Tabellen oder
            Tabellenkombinationen angeben, für die der jeweilige
            Datensatz gilt. Die Bereichsspalten in
            procs_priv geben die jeweilige
            gespeicherte Routine an, für die der Datensatz gilt.
          
Berechtigungsspalten legen fest, welche Berechtigungen durch einen Datensatz gewährt werden, d. h. welche Operationen durchgeführt werden können. Der Server kombiniert die Daten in den verschiedenen Grant-Tabellen zu einer vollständigen Beschreibung der Berechtigungen eines Benutzers. Abschnitt 5.8.6, „Zugriffskontrolle, Phase 2: Anfrageüberprüfung“, beschreibt, welches Regeln hierbei zugrundegelegt werden.
Bereichsspalten enthalten Strings. Diese werden wie nachfolgend gezeigt deklariert, wobei der Vorgabewert jeweils der Leer-String ist:
| Spaltenname | Typ | 
| Host | CHAR(60) | 
| User | CHAR(16) | 
| Password | CHAR(16) | 
| Db | CHAR(64) | 
| Table_name | CHAR(64) | 
| Column_name | CHAR(64) | 
| Routine_name | CHAR(64) | 
        Bei der Überprüfung der Host-Werte im Zuge
        der Berechtigungsverifizierung wird keine Unterscheidung der
        Groß-/Kleinschreibung vorgenommen. Die
        User-, Password-,
        Db- und Table_name-Werte
        hingegen unterscheiden die Groß-/Kleinschreibung. Nicht
        unterschieden wird sie wiederum bei
        Column_name- und
        Routine_name-Werten.
      
        In den Tabellen user, db
        und host wird jede Berechtigung in einer
        separaten Spalte aufgeführt, die als ENUM('N','Y')
        DEFAULT 'N' deklariert ist. Anders gesagt: Jede
        Berechtigung lässt sich aktivieren oder deaktivieren, wobei sie
        vorgabeseitig immer deaktiviert ist.
      
        In den Tabellen tables_priv,
        columns_priv und
        procs_priv sind die Berechtigungsspalten als
        SET-Spalten deklariert. Werte in diesen
        Spalten können eine beliebige Kombination der Berechtigungen
        enthalten, die von der Tabelle gesteuert werden:
      
| Tabellenname | Spaltenname | Mögliche Elemente des Satzes | 
| tables_priv | Table_priv | 'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop',
                'Grant', 'References', 'Index', 'Alter', 'Create View',
                'Show view', 'Trigger' | 
| tables_priv | Column_priv | 'Select', 'Insert', 'Update', 'References' | 
| columns_priv | Column_priv | 'Select', 'Insert', 'Update', 'References' | 
| procs_priv | Proc_priv | 'Execute', 'Alter Routine', 'Grant' | 
Kurz gesagt verwendet der Server die Grant-Tabellen wie folgt:
            Die Bereichsspalten in der Tabelle user
            bestimmen, ob eingehende Verbindungen abgewiesen oder
            zugelassen werden. Bei zulässigen Verbindungen geben alle
            in der Tabelle user gewährten
            Berechtigungen die globalen Berechtigungen
            (Superuser-Berechtigungen) des Benutzers an. Jede
            Berechtigung, die in dieser Tabelle gewährt wird, gilt für
            alle Datenbanken auf dem Server.
          
            Hinweis: Da alle globalen
            Berechtigungen als Berechtigungen für alle Datenbanken zu
            betrachten sind, erlaubt das Vorhandensein einer beliebigen
            globalen Berechtigung für einen Benutzer diesem, alle
            Datenbanknamen mit SHOW DATABASES oder
            durch Untersuchen der Tabelle SCHEMATA
            von INFORMATION_SCHEMA anzuzeigen.
          
            Die Bereichsspalten der Tabelle db
            bestimmen dabei, welche Benutzer von welchen Hosts aus auf
            welche Datenbanken zugreifen können. Die
            Berechtigungsspalten legen hingegen fest, welche Operationen
            zulässig sind. Eine auf der Datenbankebene gewährte
            Berechtigung gilt für die Datenbank und alle in ihr
            enthaltenen Tabellen.
          
            Die Tabelle host wird in Verbindung mit
            der Tabelle db benutzt, wenn ein
            bestimmte Datensatz in der Tabelle db
            für mehrere Hosts gelten soll. Wenn Sie beispielsweise
            einem Benutzer die Verwendung einer Datenbank von
            verschiedenen Hosts in Ihrem Netzwerk aus gestatten wollen,
            lassen Sie den Wert Host im Datensatz des
            betreffenden Benutzers in der Tabelle db
            frei und geben Sie dann einen Datensatz für jeden der
            betreffenden Hosts in die Tabelle host
            ein. Diese Vorgehensweise wird in
            Abschnitt 5.8.6, „Zugriffskontrolle, Phase 2: Anfrageüberprüfung“, genauer beschrieben.
          
            Hinweis: Die Tabelle
            host muss mit Anweisungen wie
            INSERT, UPDATE und
            DELETE direkt modifiziert werden.
            Anweisungen wie GRANT und
            REVOKE, die die Grant-Tabellen indirekt
            manipulieren, haben keine Auswirkungen auf diese Tabelle.
            Die meisten MySQL-Installationen verwenden die Tabelle
            ohnehin nicht.
          
            Die Tabellen tables_priv und
            columns_priv ähneln der Tabelle
            db, sind aber feiner abgestuft: Sie
            werden nicht auf Datenbankebene, sondern auf der Tabellen-
            und der Spaltenebene angewendet. Eine auf der Tabellenebene
            gewährte Berechtigung gilt für die Tabelle und alle in ihr
            enthaltenen Spalten. Eine auf der Spaltenebene gewährte
            Berechtigung gilt indes nur für eine bestimmte Spalte.
          
            Die Tabelle procs_priv gilt für
            gespeicherte Routinen. Eine auf der Routinenebene gewährte
            Berechtigung gilt nur für eine bestimmte Routine.
          
        Administrative Berechtigungen (wie etwa
        RELOAD oder SHUTDOWN)
        werden nur in der Tabelle user festgelegt.
        Der Grund hierfür besteht darin, dass administrative
        Operationen auf dem Server selbst erfolgen und nicht
        datenbankspezifisch sind, d. h. es gibt keinen Grund, diese
        Berechtigungen in anderen Grant-Tabellen aufzuführen.
        Tatsächlich muss der Server, um zu ermitteln, ob Sie eine
        administrative Operation durchführen dürfen, nur die Tabelle
        user abfragen.
      
        Die Berechtigung FILE wird ebenfalls nur in
        der Tabelle user festgelegt. Sie ist im
        Eigentlichen keine administrative Berechtigung, aber die
        Fähigkeit zum Lesen oder Schreiben von Dateien auf dem
        Serverhost hängt nicht von der Datenbank ab, auf die Sie
        zugreifen.
      
        Der Server mysqld liest die Inhalte der
        Grant-Tabellen beim Start in den Speicher ein. Sie können ihn
        mit der Anweisung FLUSH PRIVILEGES oder durch
        Ausführen der Befehle mysqladmin
        flush-privileges oder mysqladmin
        reload anweisen, die Tabellen neu einzulesen.
        Änderungen an den Grant-Tabellen werden umgesetzt wie in
        Abschnitt 5.8.7, „Wann Berechtigungsänderungen wirksam werden“, beschrieben.
      
        Wenn Sie die Inhalte der Grant-Tabellen ändern, empfiehlt es
        sich sicherzustellen, dass Ihre Änderungen die Berechtigungen
        so konfigurieren, wie Sie es auch wünschen. Um die
        Berechtigungen eines gegebenen Kontos zu überprüfen, verwenden
        Sie die Anweisung SHOW GRANTS. (Siehe auch
        Abschnitt 13.5.4.11, „SHOW GRANTS“.) Um also etwa die Berechtigungen
        zu ermitteln, die einem Konto mit den Host-
        und User-Werten
        pc84.example.com bzw. bob
        gewährt werden, setzen Sie folgende Anweisung ab:
      
SHOW GRANTS FOR 'bob'@'pc84.example.com';
        Weitere Hilfe zur Diagnose von Problemen in Zusammenhang mit
        Berechtigungen finden Sie in Abschnitt 5.8.8, „Gründe für Access denied-Fehler“.
        Allgemeine Richtlinien zu Sicherheitsfragen finden Sie außerdem
        in Abschnitt 5.7, „Absichern von MySQL gegen Angreifer“.
      
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.

