Cấp ** tất cả ** đặc quyền trên cơ sở dữ liệu


611

Tôi đã tạo cơ sở dữ liệu, ví dụ '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;

Bây giờ tôi có thể đăng nhập vào cơ sở dữ liệu từ mọi nơi, nhưng không thể tạo bảng.

Cách cấp tất cả các đặc quyền trên cơ sở dữ liệu đó và các bảng (trong tương lai). Tôi không thể tạo bảng trong cơ sở dữ liệu 'mydb'. Tôi luôn nhận được:

CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
ERROR 1142 (42000): CREATE command denied to user 'myuser'@'...' for table 't'

10
Bạn nhận được gì khi bạn HIỂN THỊ GRANTS CHO CURRENT_USER;
dia

5
Bạn đã thử chạy FLUSH PRIVILEGESchưa?
Romain

1
@Andy Cảm ơn bạn đã "HIỂN THỊ GRANTS CHO CURRENT_USER;" - điều đó giúp tôi nhìn thấy lỗi đánh máy của tôi.
marioosh

2
@Romain, flush privilegeskhông cần thiết khi bạn sử dụng grantlệnh. x4
Pacerier

2
Bạn nên sử dụng FLUSH PRIVILEGES;chỉ khi bạn sửa đổi các bảng cấp trực tiếp sử dụng những câu như INSERT, UPDATEhoặcDELETE
simhumileco

Câu trả lời:


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

Đây là cách tôi tạo các đặc quyền "Siêu người dùng" của mình (mặc dù tôi thường chỉ định máy chủ lưu trữ).

LƯU Ý QUAN TRỌNG

Trong khi câu trả lời này có thể giải quyết vấn đề truy cập, hãy WITH GRANT OPTIONtạo một người dùng MySQL có thể chỉnh sửa các quyền của người dùng khác .

Đặc quyền GRANT OPTION cho phép bạn cung cấp cho người dùng khác hoặc xóa khỏi người dùng khác những đặc quyền mà bạn sở hữu.

Vì lý do bảo mật, bạn không nên sử dụng loại tài khoản người dùng này cho bất kỳ quy trình nào mà công chúng sẽ có quyền truy cập (ví dụ: một trang web). Bạn nên tạo một người dùng chỉ có các đặc quyền cơ sở dữ liệu cho loại sử dụng đó.


35
@ Tên miền bạn không thực sự mang nhiều đến bảng ở đây - tôi không đặt tên người dùng của mình là myuser - người hỏi chỉ đơn giản là sử dụng tên người dùng làm ví dụ - tôi đã sử dụng cùng tên người dùng ví dụ để thống nhất.
diagonalbatman

22
Đủ công bằng. Nhưng người ta cũng phải nghĩ về những người khác, có thể là người mới, có thể đọc câu hỏi này sau. Nó không phải là điểm của SO là tốt?
Romain

7
Tôi cũng không nghĩ câu trả lời này là câu trả lời hay. Nó cung cấp đặc quyền "quản trị viên" trên tất cả các cơ sở dữ liệu và tất cả các bảng, đó không phải là những gì được yêu cầu.
daks

5
Tôi đã chỉnh sửa câu trả lời này để nói mydb. * Thay vì . , vì đó là một câu trả lời được đánh giá cao và được xem rộng rãi, và tôi tin rằng bảo mật - đặc biệt là với một người chơi bóng bẩy như MySQL - là vô cùng quan trọng. Người ta sẽ hy vọng rằng một người đọc sẽ điều tra các chi tiết của câu trả lời thay vì sao chép và dán, nhưng tôi thích thỉnh thoảng sống trong thực tế.
Jordan

4
@Romain Người dùng thiết lập máy chủ MySQL có thể đủ thông minh để nhận ra rằng họ nên thay thế myuserbằng tên người dùng tùy chỉnh của riêng họ.
AStopher

524

Đây là câu hỏi cũ nhưng tôi không nghĩ câu trả lời được chấp nhận là an toàn. Thật tốt khi tạo một siêu người dùng nhưng không tốt nếu bạn muốn cấp các đặc quyền trên một cơ sở dữ liệu.

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

%dường như không bao gồm thông tin liên lạc ổ cắm, đó localhostlà cho. WITH GRANT OPTIONchỉ tốt cho siêu người dùng, nếu không, nó thường là một rủi ro bảo mật.

Cập nhật cho MySQL 5.7+ có vẻ như điều này cảnh báo về:

Sử dụng câu lệnh GRANT để sửa đổi các thuộc tính của người dùng hiện tại ngoài các đặc quyền không được chấp nhận và sẽ bị xóa trong bản phát hành trong tương lai. Sử dụng câu lệnh ALTER USER cho thao tác này.

Vì vậy, thiết lập mật khẩu nên với các lệnh riêng biệt. Nhờ nhận xét từ @ đáng sợ-wombat.

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

Hi vọng điêu nay co ich.


26
+1 không bao gồm WITH GRANT OPTIONvà nhắm mục tiêu một cơ sở dữ liệu được chỉ định thay vì tất cả ( *).
Adonis K. Kakoulidis

@IanBussieres ngữ pháp của "% dường như không bao gồm các giao tiếp ổ cắm, rằng localhost dành cho" không rõ ràng. Điều này thực sự có ý nghĩa gì?
Thufir

2
@Thufir, tìm kiếm unix sockets. Khi sử dụng localhostmáy khách myslq trên linux đang cố gắng sử dụng ổ cắm unix thay vì kết nối TCP với máy chủ.
akostadinov

1
Lưu ý rằng bạn có thể không cần lệnh đầu tiên trừ khi bạn muốn truy cập từ các địa chỉ IP bên ngoài hoặc từ các máy tính khác trên mạng con cục bộ. Nếu bạn làm như vậy, tôi khuyên bạn nên sử dụng các lệnh được nhắm mục tiêu đến các địa chỉ IP cụ thể mà bạn muốn cho phép, chẳng hạn như myuser@192.168.0.1 (cho một trên mạng con cục bộ), thay vì myuser @% nói chung.
Evan Donovan

1
mysql ALTER USER 'root' @ 'localhost' được xác định bởi 'new_password';
Wombat đáng sợ

121

Điều này sẽ hữu ích cho một số người:

Từ dòng lệnh MySQL:

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

Đáng buồn thay, tại thời điểm này newuser không có quyền để làm bất cứ điều gì với cơ sở dữ liệu. Trên thực tế, nếu người dùng mới thậm chí cố gắng đăng nhập (bằng mật khẩu, mật khẩu), họ sẽ không thể truy cập vào trình bao MySQL.

Do đó, điều đầu tiên cần làm là cung cấp cho người dùng quyền truy cập vào thông tin họ sẽ cần.

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

Các dấu hoa thị trong lệnh này đề cập đến cơ sở dữ liệu và bảng (tương ứng) rằng chúng có thể truy cập vào lệnh này, lệnh này cho phép người dùng đọc, chỉnh sửa, thực thi và thực hiện tất cả các tác vụ trên tất cả các cơ sở dữ liệu và bảng.

Khi bạn đã hoàn tất các quyền mà bạn muốn thiết lập cho người dùng mới của mình, hãy luôn đảm bảo tải lại tất cả các đặc quyền.

FLUSH PRIVILEGES;

Những thay đổi của bạn sẽ có hiệu lực.

Để biết thêm thông tin: http://dev.mysql.com/doc/refman/5.6/en/grant.html

Nếu bạn không hài lòng với dòng lệnh thì bạn có thể sử dụng máy khách như bàn làm việc của MySQL , Navicat hoặc SQLyog


5
flush privilegeskhông cần thiết khi bạn sử dụng grantlệnh. x4
Pacerier

1
Hoặc bạn bán buôn được sao chép từ Linode hoặc họ đã sao chép từ bạn: linode.com/docs/database/mysql/ mẹo

Tôi cần xác định lại bằng GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost' IDENTIFIED BY 'my_password' WITH GRANT OPTION;(lạ ..., nhưng đúng)
rubo77

30

 1. Tạo cơ sở dữ liệu

CREATE DATABASE db_name;

 2. Tạo tên người dùng cho cơ sở dữ liệu db_name

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

 3. Sử dụng cơ sở dữ liệu

USE db_name;

 4. Cuối cùng, bạn đang ở trong cơ sở dữ liệu db_name và sau đó thực hiện các lệnh như tạo, chọn và chèn các hoạt động.


Hôm nay, điều này đã cho tôi cảnh báo "Sử dụng câu lệnh GRANT để sửa đổi các thuộc tính của người dùng hiện tại ngoài các đặc quyền không được chấp nhận và sẽ bị xóa trong bản phát hành trong tương lai. Sử dụng câu lệnh ALTER USER cho thao tác này." Vì vậy, tôi nên hiểu rằng tôi nên tạo một người dùng, sau đó cấp đặc quyền, ngay bây giờ?
felwithe

Làm thế nào bạn có thể nói với MySQL rằng usernamenên có tất cả các đặc quyền trên db_namenhưng không phải là DROP db_name;đặc quyền?
tonix

21

SQL này cấp trên tất cả các cơ sở dữ liệu nhưng chỉ là các đặc quyền cơ bản. Chúng đủ cho Drupal hoặc Wordpress và như một thứ tốt đẹp, cho phép một tài khoản nhà phát triển cho các dự án địa phương.

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, 
    INDEX, ALTER, CREATE TEMPORARY TABLES 
ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';

20
GRANT ALL PRIVILEGES ON mydb.* TO myuser@localhost IDENTIFIED BY 'mypasswd';

Hoạt động cho các đặc quyền trên lược đồ :)

Tùy chọn: sau khi mypasswdbạn có thể thêmWITH GRANT OPTION


15

Tôi chỉ có thể làm cho nó hoạt động bằng cách thêm GRANT OPTION, mà không phải lúc nào cũng nhận được quyền từ chối lỗi

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

14

Xin chào, tôi đã sử dụng mã này để có siêu người dùng trong 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;

và sau đó

FLUSH PRIVILEGES;

11
flush privilegeskhông cần thiết khi bạn sử dụng grantlệnh. x4
Pacerier

Lưu ý: Danh sách chính xác trong các GRANTphiên bản khác nhau của MySQL.
Rick James

6

Để truy cập từ máy chủ từ xa đến cơ sở dữ liệu mydb

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

Để truy cập từ máy chủ từ xa đến tất cả các cơ sở dữ liệu.

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

4

Để cấp tất cả các đặc quyền trên cơ sở dữ liệu: mydbcho người dùng : myuser, chỉ cần thực thi:

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

hoặc là:

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

Các PRIVILEGEStừ khóa là không cần thiết.

Ngoài ra tôi không biết tại sao các câu trả lời khác cho rằng IDENTIFIED BY 'password'nên đặt vào cuối lệnh. Tôi tin rằng nó không bắt buộc.

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.