mysql tạo người dùng nếu không tồn tại


94

Tôi có một truy vấn để kiểm tra danh sách người dùng mysql để tạo người dùng mới.

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

Nhưng tôi gặp lỗi này:

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

Câu trả lời:


275

Trong 5.7.6 trở lên, bạn sẽ có thể sử dụng CREATE USER

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

Lưu ý rằng phương thức 5.7.6 không thực sự cấp bất kỳ quyền nào.


Nếu bạn không sử dụng phiên bản có khả năng này (một cái gì đó dưới 5.7.6), bạn có thể làm như sau:

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

Điều này sẽ tạo người dùng nếu nó không tồn tại


Lưu ý, nếu bạn đang sử dụng MySQL 8, GRANT ALLphương pháp sẽ không tạo người dùng.


3
Điều này có thay đổi mật khẩu nếu người dùng tồn tại và có một mật khẩu khác không?
m3z

5
Nevermind - đã trả lời câu hỏi của riêng tôi - có nó - nhưng nó không thay thế cho người dùng nếu Host là khác nhau
m3z

1
@ m3z về mặt kỹ thuật, nếu bạn có người dùng có thể đăng nhập trên hai máy chủ khác nhau, họ không phải là cùng một người dùng. Họ có thể có các quyền khác nhau, mật khẩu khác nhau và mọi thứ.
Ascherer

1
Có @roundar, tuy nhiên điều đó để lại lỗ hổng bảo mật. Hãy nhận biết.
Ascherer

1
Không an toàn duy nhất nếu bạn không chỉ định mật khẩu @ B166ER, mà .... duh.
Ascherer

-3

tôi sử dụng

CHỌN TỒN TẠI (CHỌN DISTINCT userFROM mysql. userWHERE user= "tên người dùng") làm is_user

nên trả về 1 nếu tồn tại hoặc 0 nếu không


2
câu hỏi không phải về cách kiểm tra mà là cách tạo
VladL
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.