Berikan ** semua ** hak istimewa pada basis data

611

Saya telah membuat basis data, misalnya 'mydb'.

CREATE DATABASE mydb CHARACTER SET utf8 COLLATE utf8_bin;
CREATE USER 'myuser'@'%' IDENTIFIED BY PASSWORD '*HASH';
GRANT ALL ON mydb.* TO 'myuser'@'%';
GRANT ALL ON mydb TO 'myuser'@'%';
GRANT CREATE ON mydb TO 'myuser'@'%';
FLUSH PRIVILEGES;

Sekarang saya bisa masuk ke database dari mana saja, tetapi tidak bisa membuat tabel.

Bagaimana memberi semua hak istimewa pada database itu dan (di masa depan) tabel. Saya tidak bisa membuat tabel dalam database 'mydb'. Saya selalu mendapatkan:

CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
ERROR 1142 (42000): CREATE command denied to user 'myuser'@'...' for table 't'
marioosh
sumber
10
Apa yang Anda dapatkan saat MENUNJUKKAN HIBAH UNTUK CURRENT_USER;
diagonalbatman
5
Sudahkah Anda mencoba berlari FLUSH PRIVILEGES?
Romain
1
@Andy Terima kasih untuk "TUNJUKKAN HIBAH UNTUK CURRENT_USER;" - yang membantu saya melihat kesalahan ketik saya.
marioosh
2
@ Domain, flush privilegestidak diperlukan saat Anda menggunakan grantperintah. x4
Pacerier
2
Anda harus menggunakan FLUSH PRIVILEGES;hanya jika Anda memodifikasi tabel hibah langsung menggunakan pernyataan seperti INSERT, UPDATEatauDELETE
simhumileco

Jawaban:

910
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'%' WITH GRANT OPTION;

Ini adalah bagaimana saya membuat hak istimewa "Pengguna Super" (meskipun saya biasanya menentukan host).

CATATAN PENTING

Sementara jawaban ini dapat menyelesaikan masalah akses, WITH GRANT OPTIONmembuat pengguna MySQL yang dapat mengedit izin pengguna lain .

Hak istimewa GRANT OPTION memungkinkan Anda untuk memberikan kepada pengguna lain atau menghapus hak istimewa yang Anda miliki dari pengguna lain.

Untuk alasan keamanan, Anda tidak boleh menggunakan jenis akun pengguna ini untuk proses apa pun yang dapat diakses publik (yaitu situs web). Anda disarankan untuk membuat pengguna dengan hak akses database hanya untuk penggunaan semacam itu.

diagonalbatman
sumber
35
@ Domain Anda tidak benar-benar membawa banyak ke tabel di sini - saya tidak menyebut nama pengguna saya pengguna - penanya hanya menggunakan nama pengguna sebagai contoh - saya menggunakan nama pengguna contoh yang sama untuk konsistensi.
diagonalbatman
22
Cukup adil. Tetapi kita juga harus berpikir tentang orang lain, mungkin pemula, yang bisa membaca pertanyaan ini nanti. Bukankah itu inti dari SO juga?
Romain
7
Saya juga tidak berpikir jawaban ini adalah jawaban yang bagus. Ini memberikan hak istimewa "administrator" pada semua database dan semua tabel, yang tidak diminta.
daks
5
Saya mengedit jawaban ini untuk mengatakan mydb. * Bukan . , karena itu adalah jawaban yang banyak dipilih dan dilihat, dan saya percaya keamanan - terutama dengan kotoran yang dipoles seperti MySQL - sangat penting. Orang akan berharap bahwa seorang pembaca akan menyelidiki rincian jawaban daripada menyalin dan menempel, tetapi saya suka hidup dalam kenyataan sesekali.
Jordan
4
@ Pengguna Domain yang menyiapkan server MySQL cenderung cukup pintar untuk menyadari bahwa mereka harus mengganti myuserdengan nama pengguna kustom mereka sendiri.
AStopher
524

Ini pertanyaan lama tapi saya rasa jawaban yang diterima tidak aman. Ini bagus untuk membuat pengguna super tetapi tidak bagus jika Anda ingin memberikan hak istimewa pada satu basis data.

grant all privileges on mydb.* to myuser@'%' identified by 'mypasswd';
grant all privileges on mydb.* to myuser@localhost identified by 'mypasswd';

%tampaknya tidak mencakup komunikasi soket, itu localhostuntuk. WITH GRANT OPTIONhanya baik untuk pengguna super, selain itu biasanya risiko keamanan.

Pembaruan untuk MySQL 5.7+ sepertinya ini memperingatkan tentang:

Menggunakan pernyataan GRANT untuk memodifikasi properti pengguna yang sudah ada selain hak istimewa sudah tidak digunakan lagi dan akan dihapus dalam rilis mendatang. Gunakan pernyataan ALTER USER untuk operasi ini.

Jadi pengaturan kata sandi harus dengan perintah terpisah. Terima kasih atas komentar dari @ scary-wombat.

ALTER USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
ALTER USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword';

Semoga ini membantu.

akostadinov
sumber
26
+1 untuk tidak memasukkan WITH GRANT OPTIONdan menargetkan basis data tertentu, bukan semua ( *)
Adonis K. Kakoulidis
@IanBussieres tata bahasa "% tampaknya tidak mencakup komunikasi soket, bahwa localhost adalah untuk" tidak jelas. Apa arti sebenarnya?
Thufir
2
@ Thufir, cari unix sockets. Saat menggunakan localhostklien myslq di linux sedang mencoba menggunakan soket unix alih-alih koneksi TCP ke server.
akostadinov
1
Perhatikan bahwa Anda mungkin tidak memerlukan perintah pertama kecuali jika Anda ingin akses dari luar alamat IP, atau dari komputer lain di subnet lokal. Jika Anda melakukannya, saya akan merekomendasikan menggunakan perintah yang ditargetkan ke alamat IP tertentu yang ingin Anda izinkan, seperti [email protected] (untuk satu di subnet lokal), daripada myuser @% secara umum.
Evan Donovan
1
mysql> ALTER USER 'root' @ 'localhost' DIIDENTIFIKASI OLEH 'new_password';
Scary Wombat
121

Ini akan bermanfaat bagi sebagian orang:

Dari baris perintah MySQL:

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';

Sayangnya, pada saat ini pengguna baru tidak memiliki izin untuk melakukan apa pun dengan database. Bahkan, jika pengguna baru bahkan mencoba masuk (dengan kata sandi, kata sandi), mereka tidak akan dapat mencapai shell MySQL.

Oleh karena itu, hal pertama yang harus dilakukan adalah memberi pengguna akses ke informasi yang mereka butuhkan.

GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';

Tanda bintang dalam perintah ini merujuk ke database dan tabel (masing-masing) yang dapat mereka akses — perintah khusus ini memungkinkan pengguna untuk membaca, mengedit, mengeksekusi, dan melakukan semua tugas di semua database dan tabel.

Setelah menyelesaikan izin yang ingin Anda siapkan untuk pengguna baru, selalu pastikan memuat ulang semua hak istimewa.

FLUSH PRIVILEGES;

Perubahan Anda sekarang akan berlaku.

Untuk informasi lebih lanjut: http://dev.mysql.com/doc/refman/5.6/id/grant.html

Jika Anda tidak nyaman dengan baris perintah maka Anda dapat menggunakan klien seperti MySQL workbench , Navicat atau SQLyog

BrenBarn
sumber
5
flush privilegestidak diperlukan saat Anda menggunakan grantperintah. x4
Pacerier
1
Entah Anda grosir disalin dari Linode, atau mereka disalin dari Anda: linode.com/docs/databases/mysql/…
Saya perlu mengidentifikasi lagi dengan GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost' IDENTIFIED BY 'my_password' WITH GRANT OPTION;(aneh ..., tetapi benar)
rubo77
30

 1. Buat database

CREATE DATABASE db_name;

 2. Buat nama pengguna untuk basis data db_name

GRANT ALL PRIVILEGES ON db_name.* TO 'username'@'localhost' IDENTIFIED BY 'password';

 3. Gunakan database

USE db_name;

 4. Akhirnya Anda berada di database db_name dan kemudian jalankan perintah-perintah seperti buat, pilih dan masukkan operasi.

Bhavnesh
sumber
Hari ini ini memberi saya peringatan "Menggunakan pernyataan GRANT untuk mengubah properti pengguna yang ada selain hak istimewa sudah tidak digunakan lagi dan akan dihapus dalam rilis mendatang. Gunakan pernyataan ALTER USER untuk operasi ini." Jadi haruskah saya mengerti bahwa saya harus membuat pengguna, lalu memberikan hak istimewa, sekarang?
felwithe
Bagaimana Anda bisa memberi tahu MySQL yang usernameseharusnya memiliki semua hak istimewa db_nametetapi bukan DROP db_name;hak istimewa?
tonix
21

SQL ini memberikan semua basis data tetapi hanya hak-hak dasar. Mereka cukup untuk Drupal atau Wordpress dan sebagai basa-basi, memungkinkan satu akun pengembang untuk proyek lokal.

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, 
    INDEX, ALTER, CREATE TEMPORARY TABLES 
ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';
s6712
sumber
20
GRANT ALL PRIVILEGES ON mydb.* TO myuser@localhost IDENTIFIED BY 'mypasswd';

Bekerja untuk hak istimewa pada skema :)

Opsional: setelah mypasswdAnda dapat menambahkanWITH GRANT OPTION

Kemuliaan Belanda
sumber
15

Saya bisa membuatnya hanya dengan menambahkan GRANT OPTION, tanpa itu selalu menerima izin ditolak kesalahan

GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost' WITH GRANT OPTION;
GnanaPrakash
sumber
14

Halo Saya menggunakan kode ini untuk memiliki pengguna super di mysql

GRANT EXECUTE, PROCESS, SELECT, SHOW DATABASES, SHOW VIEW, ALTER, ALTER ROUTINE,
    CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP,
    EVENT, INDEX, INSERT, REFERENCES, TRIGGER, UPDATE, CREATE USER, FILE,
    LOCK TABLES, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SHUTDOWN,
    SUPER
        ON *.* TO mysql@'%'
    WITH GRANT OPTION;

lalu

FLUSH PRIVILEGES;
gastonnina
sumber
11
flush privilegestidak diperlukan saat Anda menggunakan grantperintah. x4
Pacerier
Catatan: Daftar persis di GRANTbervariasi antara Versi MySQL.
Rick James
6

Untuk mengakses dari server jarak jauh ke database mydb saja

GRANT ALL PRIVILEGES ON mydb.* TO 'root'@'192.168.2.21';

Untuk mengakses dari server jauh ke semua database.

GRANT ALL PRIVILEGES ON * . * TO 'root'@'192.168.2.21';
Pengembang
sumber
4

Untuk memberikan semua hak pada basis data: mydbkepada pengguna myuser:, cukup jalankan:

GRANT ALL ON mydb.* TO 'myuser'@'localhost';

atau:

GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost';

Kata PRIVILEGESkunci tidak perlu.

Saya juga tidak tahu mengapa jawaban lain menyarankan agar IDENTIFIED BY 'password'diletakkan di akhir perintah. Saya percaya bahwa itu tidak diperlukan.

pgmank
sumber