mysql buat pengguna jika tidak ada

95

Saya memiliki kueri untuk memeriksa daftar pengguna mysql untuk membuat pengguna baru.

IF (SELECT EXISTS(SELECT 1 FROM `mysql`.`user` WHERE `user` = '{{ title }}')) = 0 THEN
    CREATE USER '{{ title }}'@'localhost' IDENTIFIED BY '{{ password }}'
END IF;

Tetapi saya mendapatkan kesalahan ini:

ERROR 1064 (42000) at line 3: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF (SELECT EXISTS(SELECT 1 FROM `mysql`.`user` WHERE `user` = 'cms_localhost')) = 0 ' at line 1
sweb
sumber

Jawaban:

278

Di 5.7.6 dan yang lebih baru, Anda seharusnya sudah bisa menggunakan CREATE USER

CREATE USER IF NOT EXISTS 'user'@'localhost' IDENTIFIED BY 'password';

Perhatikan bahwa metode 5.7.6 sebenarnya tidak memberikan izin apa pun.


Jika Anda tidak menggunakan versi yang memiliki kemampuan ini (di bawah 5.7.6), Anda dapat melakukan hal berikut:

GRANT ALL ON `database`.* TO 'user'@'localhost' IDENTIFIED BY 'password';

Ini akan membuat pengguna jika tidak ada


Catatan, jika Anda menggunakan MySQL 8, GRANT ALLmetode ini tidak akan membuat pengguna.

Ascherer
sumber
3
Apakah ini mengubah sandi jika pengguna memang ada dan memiliki sandi yang berbeda?
m3z
5
Nevermind - menjawab pertanyaan saya sendiri - ya memang - tetapi tidak menggantikan pengguna jika Host berbeda
m3z
1
@ m3z Secara teknis, jika Anda memiliki pengguna yang dapat masuk ke dua host yang berbeda, mereka bukan pengguna yang sama. Mereka dapat memiliki izin yang berbeda, kata sandi yang berbeda, dan segalanya.
Ascherer
1
Ya @roundar, namun itu meninggalkan lubang keamanan. Waspadalah.
Ascherer
1
Ini hanya tidak aman jika Anda tidak menentukan kata sandi @ B166ER, yang .... duh.
Ascherer
-3

saya menggunakan

PILIH YANG ADA (PILIH DISTINCT userFROM mysql. userWHERE user= "username") as is_user

harus mengembalikan 1 jika ada atau 0 jika tidak ada

ingocnito
sumber
2
pertanyaannya bukan tentang bagaimana memeriksa, tetapi bagaimana membuat
VladL