2010-06-16 81 views
16

Làm cách nào để kiểm tra xem người dùng có tồn tại không?Kiểm tra xem người dùng mysql có tồn tại

Tôi đang làm trình cài đặt cho cơ sở dữ liệu mysql và tôi cần kiểm tra xem người dùng có thoát hay không, nếu không tạo người dùng, nếu có xóa người dùng và tạo lại.

điều này để tôi có thể thực thi tập lệnh mà không phải lo lắng.

cảm ơn.

Trả lời

5

Nếu bạn đang xóa người dùng MySQL dù sao thì thực sự không cần kiểm tra xem nó có tồn tại trước không. MySQL sẽ không ném bất kỳ lỗi nào nếu không có gì để xóa:

DELETE FROM mysql.user WHERE User = 'username'; 
+0

+1 để suy nghĩ trước một bước .. Tôi thích nó –

+6

Thao tác này sẽ xóa người dùng chỉ từ bảng người dùng, nếu bạn thực hiện phương pháp này, bạn cũng phải xóa từ mysql.columns_priv, mysql.db, mysql.tables_priv . Ngoài ra danh sách bảng này có thể thay đổi trong các phiên bản MySQL trong tương lai. – stivlo

+0

Đừng bao giờ xóa người dùng theo cách này. Sử dụng lệnh 'DROP USER'. –

49

MySQL lưu trữ dữ liệu người dùng trong bảng gọi là user trong cơ sở dữ liệu có tên mysql (theo mặc định). Truy vấn sau đây sẽ trả về 1 nếu người dùng có tên người dùng được chỉ định tồn tại, 0 nếu không.

SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user = 'username') 
0

MySQL thiếu NGƯỜI DÙNG THỬ NÀO DÀNH CHO NỘI DUNG.

Giải pháp tốt là cấp đặc quyền vô hại cho người dùng trước khi xóa. này sẽ tạo cho người sử dụng nếu nó không tồn tại, vì vậy nó có thể được giảm xuống một cách an toàn, như vậy:

GRANT USAGE ON *.* TO 'username'@'localhost'; 
DROP USER 'username'@'localhost'; 
FLUSH PRIVILEGES; 

SỬ DỤNG thực sự có nghĩa là không đặc quyền.

Nguồn: http://bugs.mysql.com/bug.php?id=19166

+2

Đối với hậu thế, cách giải quyết này không còn hoạt động nữa. Trích dẫn từ bình luận của một câu trả lời khác: "Đây không còn là một lựa chọn nữa." (Phiên bản hiện tại của MySQL không còn tạo một người dùng mới cho câu lệnh GRANT nữa. Đó là "Tính năng" mà họ thêm vào.;) "Để tham khảo ban đầu, hãy xem: http://stackoverflow.com/a/3241918/656243 –

0

Đây là cách tôi đã có thể làm điều đó:

#!/usr/bin/env bash 

set -o errexit 
set -o nounset 

# Create credentials file 
echo -e "[client]\nuser=root\npassword=${MYSQL_ROOT_PASSWORD}" > ~/.my.cnf 

# Create standard user and grant permissions 
if ! echo "SELECT COUNT(*) FROM mysql.user WHERE user = 'myuser';" | mysql | grep 1 &> /dev/null; then 
    echo "Creating database user ..." 
    echo "CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword'; 
      GRANT ALL PRIVILEGES ON mydatabase.* TO 'myuser'@'localhost'; 
      FLUSH PRIVILEGES;" | mysql 
else 
    echo "Database user already created. Continue ..." 
fi 

Thay đổi myuser, mydatabasemypassword cho phù hợp.

+0

Điều này không hoạt động tốt nếu tên người dùng chứa chữ số 1. Vì vậy, điều này có thể gây ra những cạm bẫy. – Joachim

+0

@Joachim chỉ thử nghiệm nó với một người dùng với 1 trong tên người dùng của nó, và nó hoạt động hoàn hảo. Bạn có chắc không? Tại sao nó không hoạt động cho người dùng với 1? – Havok

Các vấn đề liên quan