Werbung einblenden Werbung ausblenden


Home / Tutorials / mysql Handbuch / Benutzerrechte definieren


Passwort setzen für den User root
Rechte für einzelne User festlegen
Aufbau der grant tables
Logische Verknüpfungen der grant tables
Zugriff nur auf bestimmte Spalten einer Tabelle erlauben
Rechte erweitern
Rechte entziehen

Passwort setzen für den User root

Bisher hatten wir nur einen einzigen User, nämlich den User root, der ohne Angabe eines Passwortes auf die Datenbank zugreifen konnte. Wie jeder weiss, ist dies weder eine typische noch eine sinnvolle Konstellation. Wer einen Account bei einem Provider mit mysql Datenbank hat, der weiss, dass er die mysql Datenbank nur unter Angabe seines Passwortes, seines Usernamens und unter Angabe der Datenbank, die er ansteuern will, nutzen kann. Die meisten Provider erlauben dann auch nur den Zugriff auf die Datenbank, von einem bestimmten Rechner aus, meistens von dem Rechner, wo die Skripte, die die mysql Datenbank ansteuern, gehostet sind, was man aber ändern kann. Dieser Teil basiert auf mysql 3.23.28. Mi der Version 4.0.9 gab es Probleme. Der Zugriff wurde für den Root verweigert, war aber für den "normalen User" möglich. Wir gehen mal davon aus, dass hier ein kleiner bug vorliegt. Das Verfahren ist aber prinzipiell auch für 4.0.9 das gleiche. Die Konstellation, die im Moment, bevor wir dem User root ein Passwort vergeben haben und bevor wir einen User eingerichtet haben, können wir uns anschauen. Wir finden die User gelistet in der Tabelle user in der Datenbank mysql
(c:\mysql\data\mysql). Schauen wir uns an, was dort bis jetzt vorliegt.

C:\mysql\bin>mysql mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4 to server version: 4.0.9-gamma-max-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> select user,password,host from user;

user password host
root   localhost
root   %
    localhost
    %


4 rows in set (0.06 sec)
mysql>

Das heisst, die Default Einstellungen von mysql sieht etwas ungünstig. User root kann ohne Passwort von jedem x-beliebigen Rechner (%) wie auch von localhost zugreifen. Weiter haben wir noch zwei leere Einträge, die bewirken, dass jeder x-beliebige User von jedem x-beliebigen Rechner zugreifen kann. In dieser Konstellation würde es wenig nützen, dem User root ein Password zuzweisen, da ja jeder x-beliebige User weiterhin zugreifen kann. Wir veranschaulichen dies an einem Beispiel.

C:\mysql\bin>mysqladmin -u root password geheim

Anschliessend fahren wir den mysql Server runter und wieder hoch. So sind wir sicher, dass mit den aktuellen Einträgen gearbeitet wird. Dann schauen wir uns an, ob die Tabelle user aktualisiert wurde.

C:\mysql\bin>mysqladmin shutdown

C:\mysql\bin>mysqld

C:\mysql\bin>mysql mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 3.23.28-gamma-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer

mysql> select user,password,host from user;

user password host
root 58982d15048734ee localhost
    %
    localhost
root   %

4 rows in set (0.00 sec)
mysql>

Wir hätten erwartet, dass wir nach dem der Server heruntergefahren und neu gestartet wurde, uns mit mysql gar nicht mehr einloggen können. Dies ist aber nicht der Fall. Wir können uns einlogen und sogar in die sensible Datenbank user eindringen. Wir müssen also die User, die kein Password haben, löschen.
mysql> quit
Bye

C:\mysql\bin>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 3.23.28-gamma-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer

mysql>
mysql> use mysql
Database changed
mysql> delete from user where user="";
Query OK, 2 rows affected (0.11 sec)

mysql>

Nun haben wir die anonymen User gelöscht. Versuchen wir jetzt ohne Angabe eines Passwords die Datenbank anzusteuern, passiert folgendes.

C:\mysql\bin>mysqladmin shutdown

C:\mysql\bin>mysqld

C:\mysql\bin>mysql
ERROR 1045: Access denied for user: 'ODBC@localhost' (Using password: NO)

C:\mysql\bin>

Das heisst, dass ein Betreten der Datenbank nur noch unter Angabe des Usernamens und des Passwortes möglich ist.

C:\mysql\bin>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2 to server version: 3.23.28-gamma-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer

mysql>
mysql>

Das funktionniert.

Neue User hinzufügen
Wir wollen nun eine neue Datenbank einrichten, auf die der User Maria zugreifen kann.


C:\mysql\bin>mysqladmin -u root -p create Marias_Datenbank
Enter password: ******
C:\mysql\bin>

Das -p brauchen wir hier nur um anzuzeigen, dass wir erwarten, dass mysql uns zur Eingabe eines Passworts auffordert. Nachdem die Datenbank eingerichtet ist, können wir dem User Maria die Datenbank Marias_Datenbank zuordnen.

Rechte für einzelne User festlegen


mysql> grant all on Marias_Datenbank.* to Maria@localhost identified by "mary";
Query OK, 0 rows affected (0.05 sec)
mysql>

Das heisst, der user Maria hat alle Rechte an dieser Datenbank in allen Tabellen. Auf andere Datenbaken kann sie nicht zugreifen. Er identifiziert sich durch das Passwort "mary".

C:\mysql\bin>mysql -u Maria -p
Enter password: ****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 39 to server version: 3.23.28-gamma-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer

mysql>
mysql> use user;
ERROR 1044: Access denied for user: 'Maria@localhost' to database 'user'
mysql> use Marias_Datenbank;
Database changed
mysql>

Sie kann aber auf die ihr zugeordnete Datenbank zugreifen und dort Tabellen einrichten.

C:\mysql\bin>mysql -u Maria -p Marias_Datenbank
Enter password: ****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10 to server version: 3.23.28-gamma-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer

mysql>
mysql> create table tochter(Freunde char(50),Geburtstag date,Telefon char(30));
Query OK, 0 rows affected (0.05 sec)
mysql>

Was Maria in der Datenbank darf, nämlich alles, das wissen wir schon. Man kann es sich auch in der Tabelle db anschauen.

mysql> select user,host,db,select_priv,insert_priv from db;

user host db select_priv insert_priv
  % test% Y Y
Maria localhost Marias_Datenbank Y Y

2 rows in set (0.00 sec)
mysql>

Das Schema dürfte klar sein. Alle anderen Optionen (alter, delete, update, index, drop,create) funktionnieren nach dem gleichen Schema. Da wir all eingegeben haben, darf Maria in der Datenbank Marias_Datenbank alles. Der Root darf übrigens auch alles machen mit dieser Datenbank. Wir richten nun noch eine Datenbank Sohn ein.

C:\mysql\bin>mysql -u Maria -p Marias_Datenbank
Enter password: ****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13 to server version: 3.23.28-gamma-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer

mysql>
mysql> create table sohn(Freunde char(50),Geburtstag date,Telefon char(50));
Query OK, 0 rows affected (0.00 sec)
mysql>

Nun kann der User root zwei neue User einrichten, nämlich Marias_Tochter und Marias_Sohn. Diese dürfen natürlich nur auf die Tabelle Tochter bzw. auf die Tabelle Sohn zugreifen.

mysql> grant all on Marias_Datenbank.tochter to tocher@localhost identified
-> by "mary_tochter";
Query OK, 0 rows affected (0.82 sec)

mysql> grant all on Marias_Datenbank.sohn to sohn@localhost identified
-> by "mary_sohn";
Query OK, 0 rows affected (0.00 sec)
mysql>

Mit grant richten wir einen neuen user ein, nachdem wir mit mysql den mysql Client angewählt haben. Leider funktionniert das nicht, weder der user sohn noch der user tochter kann die Datenbank betreten. Versucht sich der User tochter einzuwählen, passiert folgendes.

C:\mysql\bin>mysql -u tochter -p
Enter password: ************
ERROR 1045: Access denied for user: 'tochter@localhost' (Using password: YES)

C:\mysql\bin>

Um dieses Problem zu beheben, müssen wir nun zwei Dinge verstehen. Erstens müssen wir verstehen, was in die Tabellen user,db,host,tables_priv und columns_priv in der Datenbank mysql (wir meinen die Datenbank mysql in c:\mysql\data\mysql und nicht den mysql Server) eingetragen wurde und zweitens, wie in mysql die Rechte verwaltet werden. Fangen wir mit dem ersten an.

Was wurde in die grant tables (user,db,host,tables_priv und columns_prviv) eingetragen

Erinnern wir uns. Wir haben den usern tochter und sohn Rechte mit folgendem Befehl zugewiesen.
grant all on Marias_Datenbank.sohn to sohn@localhost identified by "mary_sohn

Aufbau der grant tables

Uns beschäftigt nun die Frage, was in die grant tables eingetragen wurde. Die grant tables haben folgenden Aufbau.

die Tabelle user
User
Password
Select_priv
Insert_priv
Update_priv
Delete_priv
Index_priv
Alter_priv
Create_priv
Drop_priv
Grant_priv
References_priv
Reload_priv
Shutdown_priv
Process_priv
File_priv
die Tabelle db
Db
User
Select_priv
Insert_priv
Update_priv
Delete_priv
Index_priv
Alter_priv
Create_priv
Drop_priv
Grant_priv
die Tabelle tables_priv
Host
Db
User
Table_name
Grantor
Timestamp
Table_priv
Column_priv
die Tabelle columns_priv
Host
Db
User
Table_name
Column_name
Column_priv
Timestamp

Schauen wir uns an, was in den verschiedenen Tabellen drin steht, nachdem wir die User Maria, tochter und Sohn eingerichtet haben.
Die Tabelle user


mysql> select user,host,select_priv,shutdown_priv from user;

user host select_priv shutdown_priv
root localhost Y Y
tocher localhost N N
Maria localhost N N
root % Y Y
sohn localhost N N

5 rows in set (0.00 sec)
mysql>

Für alle anderen Werte hätte sich das gleiche Bild ergeben. Ausser für den User root sind alle Spalten auf N wie no gesetzt. Die Tabelle db

mysql> select user,db,select_priv from db;

user db select_priv
  test% Y
Maria Marias_Datenbank Y

2 rows in set (0.00 sec)
mysql>

Wir sehen, dass nur Maria als user für diese Datenbank gelistet ist, nicht aber sohn und tochter, obwohl diese ja eigentlich auch zugreifen sollen. Den Eintrag test können wir vernachlässigen, den richtet mysql automatisch ein, allerdings hat er von vorneherein keinen Zugang zum mysql Server, so dass er unproblematisch ist. Wir müssen uns nachher die genauen Zusammenhänge verdeutlichen, aber hier scheint ein Problem vorzuliegen, dies könnte der Grund sein, warum sohn und tochter nicht mal auf den mysql Server zugreifen können. Schauen wir uns die dritte Tabelle an.
Die Tabelle tables_priv

mysql> select db, user,table_name,column_priv from tables_priv;

db user table_name column_priv
Marias_Datenbank tocher tocher  
Marias_Datenbank sohn sohn  

2 rows in set (0.00 sec)
mysql>

Wir sehen also, dass in der Tabelle tables_priv wiederum die user tochter und sohn gelistet sind zusammen mit den Tabellen, auf die sie Zugriff haben. Weil es im folgenden wichtig sein wird, schauen wir uns auch noch die Spalte tables_priv an. Das heisst, das der User sohn und tochter alle Rechte an ihren Tabellen haben.

mysql> select user, table_priv from tables_priv;

user table_priv
tocher Select,Insert,Update,Delete,Create,Drop,References,Index,Alter
sohn Select,Insert,Update,Delete,Create,Drop,References,Index,Alter

2 rows in set (0.06 sec)
mysql>

Wir sehen, dass hier gelistet ist, was der einzelne User in der Tabelle tun darf.
Betrachten wir zu guter letzt noch die Tabelle columns_priv.


mysql> select db,user,table_name,column_name from columns_priv;
Empty set (0.06 sec)
mysql>

Logische Verknüpfungen der grant tables

 

Diese Tabelle hat also gar keinen Eintrag, weil dieser nicht nötig ist, da niemand ausschliesslich Rechte auf Spaltenebene hat. Wir wissen nun also, wie die Tabellen aufgebaut sind. Wüßten wir jetzt noch, wie diese Tabellen zusammenhängen, dann könnten wir den Fehler, die Tatsache, dass weder der User sohn noch der User Tochter auf die Datenbank zugreifen kann, sicher korrigieren. Machen wir uns also klar, wie die Verwaltung der Benutzerrechte bei mysql funktionniert. Anschliessend werden wir den Fehler, die Tatsache, dass sohn und tochter nichtmal auf den mysql Server zugreifen können, sicher korrigieren können. Zuerst einmal müssen wir uns folgendes klar machen. Es gibt zwei Typen von Rechten. Rechte, die die Administration des mysql Servers als solchen betreffen (shutdown, grant etc. ) und solche, die die Administration einer bestimmten Datenbank betreffen (alter, insert, delete, select, drop). Der erste Typ ist völlig unproblematisch und einfach einzusehen. Alle Rechte, die die Administration des mysql Servers als solchen betreffen, stehen in der Tabelle user. Wenn ein User in dieser Tabelle die entsprechenden Rechte nicht hat, dann kann er diese administrativen Aufgaben eben nicht wahrnehmen. Komplizierter ist es bei den Rechten, die das Verwalten einer bestimmten Datenbank ermöglichen. Wir stellen mit Verblüffung fest, dass sowohl in der Tabelle user wie auch in der Tabelle db die gleichen Spalten select_priv, insert_priv etc. etc. vorhanden sind. Wozu soll das gut sein. Die Antwort hierauf ist einfach. Die Tabellen haben eine Hierarchie. Wird in der Tabelle user festgestellt, dass der entsprechende User select, insert, update etc. Rechte hat, dann gilt dass für alle Datenbanken auf dem Server. Folglich braucht auch gar nicht weiter geprüft werden. Dies ist beim user root der Fall. Wird festgestellt, dass er diese Rechte nicht hat, wird zur Tabelle db maschiert und geschaut, ob er dort die entsprechenden Rechte hat, hat er sie, wird die Tabelle tables_priv gar nicht aufgerufen. Hat er sie dort nicht, wird weiter maschiert zu der Tabelle tables_priv und geschaut, ob dort irgendwelche Rechte definiert sind, wird dort was gefunden, darf er das, was dort definiert ist, wenn nicht, wird weiter maschiert zur Tabelle columns_priv und geschaut, ob dort etwas definiert ist. Unter diesem Gesichtspunkt erscheinen uns die Tabellen nun auch logisch. Der user root ist nur in der Tabelle user vorhanden. Da er hier sowieso alle Rechte erhält, gibt es keine Notwendigkeit, ihn in irgendeine der Folgetabellen einzutragen, sie werden in seinem Fall eh nie durchsucht. Anders verhält es sich mit dem user Maria. Sie hat in der Tabelle user keinerlei Rechte zugewiesen bekommen, folglich wird ein zweiter Versuch gestartet in der Tabelle db. Dort hat der User Maria die entsprechenden Rechte und wird folglich durchgelassen. In der Tabelle tables_priv erscheint sie nicht mehr, da diese eh nie nach dem User Maria durchsucht wird, zumindest nicht im Zusammenhang mit der Datenbank Marias_Datenbank, den für die Datenbank Marias_Datenbank hat sie alle Rechte. Klar ist also, dass die Rechte immer nur auf der Ebenen gelten, wo sie zugeordnet sind. Create auf user Ebenen heisst, der user kann überall Tabellen anlegen, create auf db Ebenen heisst, er kann Tabellen nur auf der entsprechenden Datenbank anlegen usw.. Das Problem, dass wir nun mit unseren usern sohn und tochter haben besteht darin, dass mysql den Durchlauf abbricht, wenn der user in einer Datenbank gar nicht auftaucht. Wir müssen also die user sohn und tochter in die Tabelle db und user eintragen, allerdings vergeben wir ihnen keine Rechte, den diese erhalten sie erst in der Tabelle tables_priv. Wir melden also diese beiden user in der Tabelle db an.

mysql> grant usage on Marias_Datenbank.* to sohn@localhost;
Query OK, 0 rows affected (0.16 sec)
mysql>

Das gleiche kann man mit dem user Tochter wiederholen. Nun ist ein Zugriff auf den Server möglich.

C:\mysql\bin>mysql -u sohn -p
Enter password: *********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 25 to server version: 3.23.28-gamma-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer

mysql>

Wenn wir uns jetzt die Tabelle db nochmal anschauen, sehen wir, dass der user sohn eingetragen wurde, allerdings ohne irgendwelche Rechte auf dieser Ebene.

mysql> use mysql
Database changed
mysql> select user,host,select_priv,shutdown_priv from user;

user host select_priv shutdown_priv
root localhost Y Y
tocher localhost N N
Maria localhost N N
root % Y Y
sohn localhost N N

5 rows in set (0.00 sec)
mysql>

Rekapitulieren wir nochmal

1. Melden wir einen User mit grant all on Marias_Datenbank.* to Maria@localhost identified by "mary"; an, wird Maria ohne Rechte in die Tabelle user eingetragen. In der Tabelle db wird registriert, dass sie für die Tabelle Marias_Datenbank alle Rechte hat. In der Tabelle tables_priv und columns_priv wird sie aber nicht eingetragen, da diese Tabellen in dieser Konstellation ohnehin nicht abgeprüft werden, wenn sich der user Maria einloggt.
2. Melden wir einen User
grant all on Marias_Datenbank.tochter to tocher@localhost identified by mary_tochter
an, dann wird tochter zwar in die Tabelle user, nicht aber in die Tabelle db eingetragen. Das müssen wir dann mit grant usage on Marias_Datenbank.* to sohn@localhost; nachholen, da sonst überhaupt kein Zugriff auf die Datenbank möglich ist. Dass der user tochter in der Tabelle tables_priv richtig eingetragen wird, nützt uns also erstmal wenig.

Prüfen wir nochmal ob es tatsächlich funktionniert.

C:\mysql\bin>mysql -u sohn -p
Enter password: *********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 32 to server version: 3.23.28-gamma-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer

mysql>
mysql> use Marias_Datenbank;
Database changed
mysql> insert into sohn(Freunde,Geburtstag,Telefon) values
-> ("Balduin",1978-11-23,"030-3445345");
Query OK, 1 row affected (0.00 sec)

mysql> insert into tochter(Freunde,Geburtstag,Telefon) values
-> ("Balduin",1978-11-23,"030-3445345");
ERROR 1142: insert command denied to user: 'sohn@localhost' for table 'tochter'
mysql>

Wie deutlich zu sehen, ist ein Eintrag in die Tabelle sohn für den user sohn zwar möglich, nicht aber in die Tabelle tochter. Folglich ist es so, wie wir uns das vorgestellt hatten.
Zugriff für nur bestimmte Spalten einer Tabelle erlauben

Zugriff nur auf bestimmte Spalten einer Tabelle erlauben

Mit mysql ist es auch möglich, nur auf bestimmte Spalten einer Tabelle einen Zugriff zu erlauben. Denkbar ist, dass ein bestimmter user sich in der Tabelle Freund nur die Spalten Freund und Geburtstag, nicht aber die Spalte Telefon anschauen kann. Wir richten ihn folglich folgendermassen ein.

C:\mysql\bin>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 33 to server version: 3.23.28-gamma-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer

mysql>
mysql> use mysql
Database changed
mysql> grant select (Freunde,Geburtstag),update(Geburtstag) on
-> Marias_Datenbank.sohn to balduin@localhost;
Query OK, 0 rows affected (0.11 sec)

mysql>

Was erwarten wir nun ? Wir erwarten, dass in der Tabelle user der neue User Balduin eingetragen ist, allerdings ohne Rechte. Aus dem vorherigen Abschnitt wissen wir, dass in der Tabelle db, der User Balduin nicht vorhanden ist, obwohl er da hin muss, weil er sonst nicht mal den mysql Server ansprechen kann. In der Tabelle tables_priv hat der User Balduin keine Rechte, folglich muss mysql auf der nächsten Stufe suchen, in columns_priv, wo dann tatsächlich die Rechte definiert sind. Schauen wir uns das im einzelnen. Anschliessend werden wir den User Balduin noch ohne Rechte in die Tabelle db eintragen. Weiter haben wir dem User Balduin kein Password zugeteilt. Welche Auswirkungen das hat, müssen wir dann noch untersuchen.
Die Tabelle user

mysql> select user,host,select_priv,shutdown_priv from user;

user host select_priv shutdown_priv
root localhost Y Y
tocher localhost N N
Maria localhost N N
root % Y Y
sohn localhost N N
balduin localhost N N

6 rows in set (0.00 sec)
mysql>

Die Tabelle db

mysql> select user,db,select_priv from db;

user db select_priv
  test% Y
Maria Marias_Datenbank Y
sohn Marias_Datenbank N

3 rows in set (0.00 sec)
mysql>

Die Tabelle tables_priv

mysql> select db,user,table_name,column_priv from tables_priv;

db user table_name column_priv
Marias_Datenbank tocher tocher  
Marias_Datenbank sohn sohn  
Marias_Datenbank balduin sohn Select,Update

3 rows in set (0.05 sec)
mysql>

Die Tabelle columns_priv

mysql> select db,user,column_name,table_name,column_priv from columns_priv;

db user column_name table_name column_priv
Marias_Datenbank balduin Freunde sohn select
Marias_Datenbank balduin Geburtstag sohn select update

2 rows in set (0.00 sec)
mysql>

Wir sehen also, dass der User Balduin in der Tabelle tables_priv einen Eintrag hat, der angibt, dass er in bestimmten Tabellen select und update durchführen darf. Wo genau steht dann in columns_priv. Der user Balduin hat, aus den oben erwähnten Gründen, noch keine Zugriff auf den mysql Server.Wir melden ihn also in der Tabelle db an.

mysql> grant usage on Marias__Datenbank.* to balduin@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql>

Nachdem wir den Server mit mysqladmin -u root -p shutdown herungergefahren und wieder anschliessend mit mysqld wieder hochgefahren haben sind die Änderungen aktiv. Wir versuchen nun als User Balduin einen Zugang zum mysql Server zu erhalten.

C:\mysql\bin>mysql -u balduin
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 3.23.28-gamma-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer

mysql>

Und tatsächlich, wir erhalten ihn, sogar ohne die Eingabe eines Passwortes, was wir ja tatsächlich auch nicht eingerichtet haben. Das ist zwar nicht besonders schlimm, da der User Balduin eh nicht viel darf, er darf ja nur in der Tabelle sohn der Datenbank Marias_Datenbank in den Spalten Freunde und Geburtstag suchen sowie die Spalte Geburtstag verändern, aber das gleiche hätte uns auch mit anderen, wichtigen Datenbanken und Tabellen passieren können. Im Moment kann jeder, der weiss, dass es den User Balduin gibt, mit Balduin den mysql Server betreten. Prüfen wir kurz, ob alles ordnungsgemäss funktionniert und setzen dann für den User Balduin nachträglich ein Passwort.

C:\mysql\bin>mysql -u balduin
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2 to server version: 3.23.28-gamma-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer

mysql> use Marias_Datenbank;
Database changed
mysql> select Freunde,Geburtstag from sohn;

Freunde Geburtstag
Balduin 0000-00-00

1 row in set (0.00 sec)

mysql> update sohn set Geburtstag="19791123";
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select telefon from sohn;
ERROR 1143: select command denied to user: 'balduin@localhost' for column 'telef
on' in table 'sohn'
mysql>

Wie deutlich zu erkennen, kann select und update mit den angegebenen Spalten durchgeführt werden. Für die Spalte Telefon jedoch wurden keine Rechte vergeben und folglich kann der User Balduin auf diese Spalte auch nicht zugreifen. Setzen wir zum Abschluss noch ein Passwort für den User Balduin.

C:\mysql\bin>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 3.23.28-gamma-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer

mysql>
mysql> set password for balduin@localhost=password('Hunnenkoenig');
Query OK, 0 rows affected (0.00 sec)

mysql>

Nachdem wir diese Änderung durchgeführt haben, muss sich auch der User Balduin durch ein Password authentifizieren.

C:\mysql\bin>mysql -u balduin -p
Enter password: ************
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5 to server version: 3.23.28-gamma-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer

mysql>

Rechte erweitern


Wollen wir dem User tochter alle Rechte an der Datenbank Marias_Datenbank geben, führen wir einfach den grant Befehl entsprechen aus.


C:\mysql\bin>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7 to server version: 3.23.28-gamma-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer

mysql>
mysql> use mysql
Database changed
mysql> grant all on Marias_Datenbank to tochter@localhost";
Query OK, 0 rows affected (0.00 sec)

mysql>

Danach kann der User tochter auf jede Tabelle der Datenbank Marias_Datenbank zugreifen.

C:\mysql\bin>mysql -u tochter -p
Enter password: ************
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 3.23.28-gamma-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer

mysql>
mysql> use Marias_Datenbank
Database changed
mysql> select * from sohn;

Freunde Geburtstag Telefon
Balduin 1979-11-23 030-3445345

1 row in set (0.33 sec)

mysql> insert into sohn values ("Hans","1976-08-07","3847444");
Query OK, 1 row affected (0.06 sec)

Rechte entziehen

Nehmen wir mal an, das war zuviel des Guten. Der User tochter soll die Tabelle sohn in Marias Datenbank zwar lesen, aber nicht verändern dürfen, weder update noch insert. Folglich müssen wir dem User tochter wieder Rechte entziehen. Damit der User Maria aber das Recht hat, die Benutzerrechte an der Datenbank Marias_Datenbank zu ändern, wir haben alle grant Befehle bis jetzt als User root ausgeführt, muss der User root aber Maria erstmal das Recht geben, die Rechte zu ändern. Bis jetzt hat sie dieses Recht noch nicht.

C:\mysql\bin>mysql -u root -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4 to server version: 3.23.28-gamma-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer

mysql>
mysql> use mysql
Database changed
mysql> select db,user,Grant_priv from db;

db user Grant_priv
test% N
Marias_Datenbank Maria N
Marias_Datenbank sohn N
Marias_Datenbank balduin N
Marias_Datenbank tochter N

5 rows in set (0.05 sec)
mysql>

Wenn wir Maria also das Recht zuweisen wollen, anderen Usern Rechte an Ihrer Datenbank zu entziehen, dann müssen wir sowas in der Art machen. Natürlich müssen wir uns hierfür erstmal als User root einloggen.

mysql> grant grant option on Marias_Datenbank.* to Maria@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql> use mysql
Database changed
mysql> select db,user,Grant_priv from db;

db user Grant_priv
test% N
Marias_Datenbank Maria Y
Marias_Datenbank sohn N
Marias_Datenbank balduin N
Marias_Datenbank tochter N

5 rows in set (0.00 sec)
mysql>

Wie deutlich zu sehen, hat Maria jetzt das Recht, selber grant Rechte zu vergeben, bzw. zu entziehen. Nun kann der User Maria dem user tochter die Rechte für update und insert entziehen.

mysql> revoke all on Marias_Datenbank.* from tochter@localhost;
Query OK, 0 rows affected (0.05 sec)

Nachdem die globalen Rechte in der Tabelle db entzogen sind, was wir gleich noch kontrollieren, können wir im zweiten Schritt die entsprechenden Rechte Rechte wieder zuweisen.

mysql> select db,user,select_priv from db;

db user Grant_priv
test% Y
Marias_Datenbank Maria Y
Marias_Datenbank sohn N
Marias_Datenbank balduin N

4 rows in set (0.00 sec)
mysql>

Wie deutlich zu sehen, war das zuviel des Guten. Nun ist der tochter user in der Tabelle db gar nicht mehr enthalten, das heisst, er kann die Datenbank gar nicht mehr betreten. Wir richten ihn also ohne Rechte wieder ein. Revoke funktionniert nur so. Rechte müssen erstmal komplett entzogen und dann wieder zugewiesen werden.

mysql> grant usage on Marias_Datenbank.* to tochter@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql>

Jetzt ist er als user wieder vorhanden, wenn auch ohne Rechte.

mysql> select db,user,select_priv from db;

db user Grant_priv
test% Y
Marias_Datenbank Maria Y
Marias_Datenbank sohn N
Marias_Datenbank balduin N
Marias_Datenbank tochter N

5 rows in set (0.00 sec)
mysql>

Nebenbemerkung:
Der Befehl

grant update(Freunde,Geburtstag),insert(Freunde,Geburtstag) on Marias_Datenbank.sohn to tochter@localhost

macht einen Eintrag in die Tabelle tables_priv, aber keinen in die Tabelle Marias_Datenbank. Der Befehl
grant update(Freunde,Geburtstag),insert(Freunde,Geburtstag) on Marias_Datenbank.* to tochter@localhost

macht eine Eintrag in die Tabelle db. Das gleiche gilt leider auch für revoke. Will man einem user, der alle Rechte an der Datenbank hat nur noch Rechte an einer Tabelle zuweisen, dann muss man zuerst, den Eintrag in der Tabelle db revidieren und ihm dann in der Tabelle tables_priv die Rechte wieder zuweisen. mysql erkennt die logischen Strukturen im Moment noch nicht alleine. Soll der user in der Tabelle sohn als jetzt Rechte eingeräumt bekommen, können wir sie ihm jetzt, nachdem wir ihm die globalen Rechte in der Tabelle db entzogen haben, wieder zuweisen.

mysql> grant update(Freunde,Geburtstag), insert(Freunde,Geburtstag),
-> select (Freunde,Geburtstag) on Marias_Datenbank.sohn to
-> tochter@localhost;
Query OK, 0 rows affected (0.05 sec)
mysql>

Jetzt kann der user Tochter auch in der Tabelle sohn Datensätze eintragen.

C:\mysql\bin>mysql -u tochter -p
Enter password: ************
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2 to server version: 3.23.28-gamma-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer

mysql>
mysql> use Marias_Datenbank;
Database changed
mysql> insert into sohn (Freunde,Geburtstag) values
-> ("Helmut Kohl","1944-02-11");
Query OK, 1 row affected (0.05 sec)

mysql>

vorhergehendes Kapitel