Ich habe ein Benutzerkonto - nennen wir es "WordPress" -, mit dem ich auf einige Katalogtabellen in einer anderen E-Commerce-Datenbank auf demselben Server zugreifen kann. Ich habe den Benutzer mit drei Hostmasken konfiguriert, von denen aus eine Verbindung hergestellt werden darf: 'localhost', die IP-Adresse des Webservers und der Hostname des Webservers. Keine Probleme da.
Der 'WordPress'-Benutzer hat außerdem vollen Zugriff auf seine eigene Datenbank, die über den Abschnitt Schema-Berechtigungen in MySQL Workbench gewährt wird. Hier wird angezeigt, dass der Host '%' ist, was ich möchte, da ich nicht drei doppelte Berechtigungssätze für denselben Benutzer verwalten möchte. Wenn ich in mysql.db nachschaue, werden diese Berechtigungen mit '%' in der Spalte Host angezeigt.
Jetzt möchte ich eine SELECT-Berechtigung für eine Handvoll Tabellen in einer anderen Datenbank erteilen - nennen wir es "Speichern". Also versuche ich das:
GRANT SELECT ON store.catalog TO 'wordpress'@'%';
Und ich erhalte die Meldung "Keine passende Zeile in der Benutzertabelle gefunden", aus dem offensichtlichen Grund, dass "%" keine Hostmaske ist, von der ich ausdrücklich eine Verbindung für diesen bestimmten Benutzer zugelassen habe. Wie lautet also die richtige Syntax, um einem Benutzer eine Tabellenberechtigung aus einer der zulässigen Hostmasken zu erteilen? Wie kommt MySQL Workbench damit für Schema-Berechtigungen durch? Ich muss keine Zeilen manuell in mysql.tables_priv einfügen, oder?
UPDATE : Zur Verdeutlichung sehen Sie hier, wie die aktuellen Benutzer-/Grant-Tabellen aussehen. Ich habe natürlich einige Namen anonymisiert. Beachten Sie, dass der Host in der Schemaberechtigungstabelle '%' ist, aber es gibt keine Benutzer mit diesem Host. Wie kann ich MySQL dazu bringen, dies mit Schemaobjektgewährungen zu tun? Am besten ohne direkt in mysql.tables_priv herumzuspielen, aber ich werde es tun, wenn es darauf ankommt.
mysql> SELECT user, Host FROM mysql.user WHERE user = 'wordpress';
+-----------+-----------+
| user | Host |
+-----------+-----------+
| wordpress | 10.0.0.22 |
| wordpress | webserver |
| wordpress | localhost |
+-----------+-----------+
3 rows in set (0.00 sec)
mysql> SELECT user, Host, db, select_priv FROM mysql.db WHERE User = 'wordpress';
+-----------+------+----------------+-------------+
| user | Host | db | select_priv |
+-----------+------+----------------+-------------+
| wordpress | % | wordpress | Y |
| wordpress | % | wordpress_test | Y |
+-----------+------+----------------+-------------+
2 rows in set (0.00 sec)
mysql> SHOW GRANTS FOR 'wordpress'@'localhost';
+---------------------------------------------------------------------------+
| Grants for [email protected] |
+---------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wordpress'@'localhost' IDENTIFIED BY PASSWORD '--' |
+---------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SHOW GRANTS FOR 'wordpress'@'%';
ERROR 1141 (42000): There is no such grant defined for user 'wordpress' on Host '%'
Tut MySQL Workbench etwas schrecklich Undokumentiertes mit Schema-/Objektberechtigungen? Nur zum Spaß habe ich einer der spezifischen user @ Host-Kombinationen einige Tabellenberechtigungen erteilt und dann mysql.tables_priv aktualisiert, um den Host in '%' zu ändern. Nach dem Ausführen von FLUSH PRIVILEGES funktionierte es perfekt. Seltsam.
Wenn Sie GRANT SELECT ON store.catalog TO 'wordpress'@'%';
Ausführen, möchte mysqld eine Zeile in die Grant-Tabelle mysql.tables_priv
Einfügen. Hier ist mysql.tables_priv:
mysql> show create table mysql.tables_priv\G
*************************** 1. row ***************************
Table: tables_priv
Create Table: CREATE TABLE `tables_priv` (
`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
`Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
`User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '',
`Table_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
`Grantor` char(77) COLLATE utf8_bin NOT NULL DEFAULT '',
`Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`Table_priv` set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') CHARACTER SET utf8 NOT NULL DEFAULT '',
`Column_priv` set('Select','Insert','Update','References') CHARACTER SET utf8 NOT NULL DEFAULT '',
PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`),
KEY `Grantor` (`Grantor`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Table privileges'
1 row in set (0.00 sec)
mysql>
Da Sie eine Zeile in mysql.table_priv
Einfügen möchten, wobei user = 'wordpress' und Host = '%', muss in mysql.user
Eine Zeile vorhanden sein, in der user = 'wordpress' und Host = ' % '.
Sie haben auch erwähnt, dass Sie MySQL Workbench verwenden. Sie müssen 'root'@'localhost'
Verwenden. Das hätte normalerweise alle Rechte und ein Passwort.
Wenn Sie nur anonymes SELECT für diese Tabelle zulassen möchten, führen Sie zunächst Folgendes aus:
GRANT USAGE ON *.* TO 'wordpress'@'%';
Dadurch wird [email protected]'%'
In mysql.user
Platziert. Danach sollte GRANT SELECT ON store.catalog TO 'wordpress'@'%'
Einwandfrei laufen.
Sie müssen sehen, welche anderen wordpress Einträge in mysql.user
Sind. Dies sollte zeigen, welche SQL GRANT-Befehle Sie benötigen:
SELECT CONCAT('GRANT SELECT ON store.catalog TO ',userhost,';') GrantCommand
FROM
(
SELECT CONCAT('''',user,'''@''',Host,'''') userhost
FROM mysql.user WHERE user='wordpress'
) A;
Dies funktionierte bei mir über die Befehlszeile (nicht über die Workbench):
mysql> GRANT SELECT ON foo.bar TO 'wordpress'@'%';
Query OK, 0 rows affected (0.07 sec)
mysql> SHOW GRANTS FOR [email protected]'%';
+------------------------------------------------+
| Grants for [email protected]% |
+------------------------------------------------+
| GRANT USAGE ON *.* TO 'wordpress'@'%' |
| GRANT SELECT ON `foo`.`bar` TO 'wordpress'@'%' |
+------------------------------------------------+
2 rows in set (0.05 sec)
Ich stöberte herum und fand dies Fehlerbericht . Welche Version ist Ihre Workbench? Es scheint, dass sie ein Update haben, aber da sie kein Benutzer von Workbench sind, kenne ich ihre Versionierung nicht (die aktuelle Version sollte behoben sein).
Auch wenn dies nicht der Fall ist, besteht die Lösung darin, es über die Befehlszeile auszuführen!