Wie erteile ich automatisch alle Berechtigungen für ein Schema, das von einem Benutzer in MySQL erstellt wurde?

7

Jemand ist neu in die Firma eingetreten und ich habe ein Konto für sie in MySQL erstellt, indem ich Folgendes verwendet habe:

CREATE USER 'username' IDENTIFIED BY 'password'

Sie muss ihr eigenes Schema erstellen und verwendet:

GRANT CREATE ON *.* TO username;

Das Problem ist, dass sie jetzt neue Schemas und Tabellen erstellen kann, aber nichts damit anfangen kann. Ich möchte, dass sie keinen Zugriff auf vorhandene Schemas / Tabellen hat, sondern ihre eigene Datenbank erstellen und alles damit machen kann. Ist das möglich?

Marsellus Wallace
quelle

Antworten:

6

Um alle Privilegien in der Datenbank mydbzu gewährenusername

GRANT ALL PRIVILEGES ON mydb.* TO username;

Um Privilegien auf einem Tisch mydb.mytablezu gewährenusername

GRANT ALL PRIVILEGES ON mydb.mytable TO username;

Ich schlage vor, dass Sie den Benutzer zuerst löschen, um alle serverweiten Berechtigungen zu löschen.

DROP USER username;
CREATE USER username;
GRANT ALL PRIVILEGES ON mydb.* TO username;

Warum den Benutzer zuerst fallen lassen? Wenn Sie zum ersten Mal einen Benutzer namens " usernameAnmelden" erstellen , hat der Benutzername keine Berechtigungen. Lauf einfach, um es SHOW GRANTS;zu sehen. Es sollte so etwas sagen GRANT USAGE ON *.* TO username. In diesem Moment usernamekann sich nur anmelden. Das ist Ihre Chance, Privilegien zu schaffen.

Wenn du läufst

GRANT ALL PRIVILEGES ON *.* TO username;

Der Benutzername verfügt über globale Datenbankberechtigungen (alle Datenbanken).

Wenn du läufst

GRANT ALL PRIVILEGES ON mydb.* TO username;

Der Benutzername verfügt nur über datenbankweite Berechtigungen für die mydbDatenbank.

Wenn du läufst

GRANT ALL PRIVILEGES ON mydb.mytable TO username;

Der Benutzername hat nur Tabellenberechtigungen für die Datei mydb.mytable.

Sie können sie nicht mischen. Wenn Sie dies tun, verlieren Sie versehentlich usernameBerechtigungen, usernamedie Sie nicht haben sollten.

Wenn Sie sehen möchten, welche Berechtigungen auf den drei Ebenen vorhanden sind, führen Sie die folgenden Abfragen aus

SELECT table_name,column_name
FROM information_schema.columns
WHERE table_schema='mysql'
AND table_name IN ('user','db','tables_priv')
AND column_name LIKE '%\_priv'
ORDER BY table_name,column_name;

Hier sind Privilegien für MySQL 5.5

mysql> SELECT table_name,column_name
    -> FROM information_schema.columns
    -> WHERE table_schema='mysql'
    -> AND table_name IN ('user','db','tables_priv')
    -> AND column_name LIKE '%\_priv'
    -> ORDER BY table_name,column_name;
+-------------+------------------------+
| table_name  | column_name            |
+-------------+------------------------+
| db          | Alter_priv             |
| db          | Alter_routine_priv     |
| db          | Create_priv            |
| db          | Create_routine_priv    |
| db          | Create_tmp_table_priv  |
| db          | Create_view_priv       |
| db          | Delete_priv            |
| db          | Drop_priv              |
| db          | Event_priv             |
| db          | Execute_priv           |
| db          | Grant_priv             |
| db          | Index_priv             |
| db          | Insert_priv            |
| db          | Lock_tables_priv       |
| db          | References_priv        |
| db          | Select_priv            |
| db          | Show_view_priv         |
| db          | Trigger_priv           |
| db          | Update_priv            |
| tables_priv | Column_priv            |
| tables_priv | Table_priv             |
| user        | Alter_priv             |
| user        | Alter_routine_priv     |
| user        | Create_priv            |
| user        | Create_routine_priv    |
| user        | Create_tablespace_priv |
| user        | Create_tmp_table_priv  |
| user        | Create_user_priv       |
| user        | Create_view_priv       |
| user        | Delete_priv            |
| user        | Drop_priv              |
| user        | Event_priv             |
| user        | Execute_priv           |
| user        | File_priv              |
| user        | Grant_priv             |
| user        | Index_priv             |
| user        | Insert_priv            |
| user        | Lock_tables_priv       |
| user        | Process_priv           |
| user        | References_priv        |
| user        | Reload_priv            |
| user        | Repl_client_priv       |
| user        | Repl_slave_priv        |
| user        | Select_priv            |
| user        | Show_db_priv           |
| user        | Show_view_priv         |
| user        | Shutdown_priv          |
| user        | Super_priv             |
| user        | Trigger_priv           |
| user        | Update_priv            |
+-------------+------------------------+
50 rows in set (0.01 sec)

mysql>

Führen Sie die Abfrage aus, um die Berechtigungen für 5.1 und 5.0 anzuzeigen

RolandoMySQLDBA
quelle
Dank des Problems besteht darin, dass Benutzer A beim Erstellen eines neuen Schemas / einer neuen Tabelle überhaupt keine Berechtigungen für die gerade erstellten Entitäten hat. Ich möchte, dass er oder sie stattdessen alle Berechtigungen hat, ohne dass der Root-Benutzer (ich) eingreift. Ist das möglich?
Marsellus Wallace
Sie haben also einen Benutzer, der über Berechtigungen in Schema a verfügt. Aber werden Objekte in Schema b erstellt? Oder hat Ihr Benutzer nur Berechtigungen für einen bestimmten Satz von Objekten?
Klumpiger
Ich möchte, dass ein Benutzer Schemas erstellen kann. Sobald ein Benutzer ein Schema erstellt hat, möchte ich, dass er oder sie automatisch alle Berechtigungen für dieses Schema hat. Auf diese Weise kann ich neue Benutzer herumspielen lassen und ziemlich autonom sein, ohne das Risiko einzugehen, vorhandene Daten zu gefährden
Marsellus Wallace,
1
Was Sie fragen, ist das Standardprotokoll für Oracle, da beim Erstellen eines Benutzers in Oracle automatisch ein Schema im Standardtabellenbereich oder im Tabellenbereich Ihrer Wahl generiert wird. MySQL folgt diesem Paradigma nicht. In MySQL sollte ein Benutzer mit allen Berechtigungen für die Benutzererstellung und die nachfolgenden Zuweisungen von Anmeldeinformationen verantwortlich sein.
RolandoMySQLDBA
Ein MySQL-Benutzer kann GRANT-Befehle verwenden, um anderen MySQL-Benutzern Berechtigungen zuzuweisen, kann jedoch nur so viele Berechtigungen zuweisen, wie der Benutzer besitzt.
RolandoMySQLDBA
1
CREATE TABLESPACE dwtblspc LOGGING DATAFILE 'D:\oraclexe\app\oracle\oradata\XE\DWTBLSPC.DBF' SIZE 300M AUTOEXTEND ON NEXT 1048K MAXSIZE UNLIMITED;

CREATE USER prateek IDENTIFIED  by prateek DEFAULT TABLESPACE dwtblspc ACCOUNT UNLOCK;

GRANT unlimited tablespace to prateek ;

CREATE ROLE prateek_role;

GRANT CREATE SESSION,ALTER SESSION,CREATE TABLE,CREATE CLUSTER,CREATE SYNONYM,CREATE VIEW,CREATE SEQUENCE,
CREATE DATABASE LINK,CREATE PROCEDURE,CREATE TRIGGER,CREATE TYPE,CREATE OPERATOR,CREATE INDEXTYPE,BACKUP ANY TABLE,
SELECT ANY TABLE,CREATE ANY TABLE,CREATE ANY INDEX,ALTER ANY INDEX,ALTER ANY INDEXTYPE,DROP ANY INDEX,DROP ANY INDEXTYPE to prateek_role;

GRANT prateek_role to prateek ;

Hoffe es hilft. Hoffe es hilft.

Sai Prateek
quelle
1
Der Beitrag des OP war eindeutig mit MySQL gekennzeichnet - Ihre Antwort ist also nicht sehr nützlich ;-).
Vérace
Wenn Sie konzeptionell klar sind, spielt es keine Rolle, welche Persistenz auch immer besteht. Ich denke, sie kann eine klare Anleitung für andere als die Syntax geben.
Sai Prateek
Diese Antwort hilft nicht, weil 1) es in MySQL keine Rollen gibt, 2) viele der Zuschüsse, die Sie in Ihrer Antwort haben, nicht in den MySQL-Zuschusstabellen vorhanden sind, 3) es gibt keine Typen in MySQL, 4) keine Sequenzen in MySQL , 5) keine Datenbankverknüpfungen, 6) keine Operatoren, 7) keine Cluster, 8) keine Synonyme, 9) keine Sicherungszuschüsse, 10) Es gibt separate GRANTs für 4 Zugriffsebenen. Sie sind in MySQL nicht vereint, wie Sie von SQL Server zeigen. 11) Zuschüsse sind nicht tabellenbereichsabhängig. 12) Kein Konzept von ANY TABLE und ANY INDEX als separater Zuschuss usw.
RolandoMySQLDBA
@ Rolando Ich glaube nicht, dass dies SQL Server-spezifisch ist, es ist Oracle-spezifisch. Ändert nichts, nur Klarstellung. :-) Wie auch immer, es ist ein Versuch zu antworten, es ist einfach falsch.
Aaron Bertrand
@ AaronBertrand OMG du hast recht, es ist Oracle. es ist im Weg.
RolandoMySQLDBA