ให้สิทธิ์ ** ทั้งหมด ** บนฐานข้อมูล


611

ฉันได้สร้างฐานข้อมูลเช่น '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;

ตอนนี้ฉันสามารถเข้าสู่ระบบฐานข้อมูลได้จากทุกที่ แต่ไม่สามารถสร้างตารางได้

วิธีการให้สิทธิ์ทั้งหมดในฐานข้อมูลนั้นและตาราง (ในอนาคต) ฉันไม่สามารถสร้างตารางในฐานข้อมูล 'mydb' ฉันได้รับเสมอ:

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
สิ่งใดที่คุณจะได้รับเมื่อคุณแสดงให้เห็นถึงเงินทุนสำหรับ CURRENT_USER
diagonalbatman

5
คุณเคยลองวิ่งFLUSH PRIVILEGESไหม?
Romain

1
@ ขอบคุณสำหรับ "SHOW GRANTS สำหรับ CURRENT_USER;" - ที่ช่วยให้ฉันเห็นตัวพิมพ์ผิดของฉัน
marioosh

2
@Romain flush privilegesไม่จำเป็นเมื่อคุณใช้grantคำสั่ง x4
Pacerier

2
คุณควรใช้FLUSH PRIVILEGES;เฉพาะในกรณีที่คุณปรับเปลี่ยนตารางให้โดยตรงโดยใช้งบเช่นINSERT, UPDATEหรือDELETE
simhumileco

คำตอบ:


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

นี่คือวิธีที่ฉันสร้างสิทธิ์ "Super User" ของฉัน (แม้ว่าปกติฉันจะระบุโฮสต์)

โน๊ตสำคัญ

ในขณะที่คำตอบนี้สามารถแก้ปัญหาของการเข้าถึงWITH GRANT OPTIONสร้าง MySQL ผู้ใช้ที่สามารถแก้ไขสิทธิ์ของผู้อื่น

สิทธิ์ GRANT OPTION ช่วยให้คุณสามารถให้สิทธิ์ผู้ใช้รายอื่นหรือลบสิทธิ์ที่คุณเป็นเจ้าของออกจากผู้ใช้รายอื่น

เพื่อเหตุผลด้านความปลอดภัยคุณไม่ควรใช้บัญชีผู้ใช้ประเภทนี้สำหรับกระบวนการใด ๆ ที่สาธารณชนจะเข้าถึงได้ (เช่นเว็บไซต์) ขอแนะนำให้คุณสร้างผู้ใช้ที่มีสิทธิ์ฐานข้อมูลสำหรับการใช้งานประเภทนั้นเท่านั้น


35
@ โดเมนคุณไม่ได้นำจำนวนมากมาที่นี่ - ฉันไม่ได้ตั้งชื่อผู้ใช้ของฉัน myuser - ผู้ถามใช้เพียงชื่อผู้ใช้เป็นตัวอย่าง - ฉันใช้ชื่อผู้ใช้ตัวอย่างเดียวกันเพื่อความมั่นคง
diagonalbatman

22
ยุติธรรมพอสมควร แต่ก็ต้องคิดเกี่ยวกับคนอื่นอาจเป็นมือใหม่ที่อาจมาอ่านคำถามนี้ในภายหลัง มันเป็นจุดของ SO เช่นกันหรือไม่
Romain

7
ฉันไม่คิดว่าคำตอบนี้เป็นคำตอบที่ดี จะให้สิทธิ์ "ผู้ดูแลระบบ" ในฐานข้อมูลทั้งหมดและตารางทั้งหมดซึ่งไม่ใช่สิ่งที่ถูกถาม
daks

5
ฉันแก้ไขคำตอบนี้จะพูด mydb. * แทน เนื่องจากมันเป็นคำตอบที่ได้รับการยอมรับอย่างกว้างขวางและได้รับการยอมรับอย่างกว้างขวางและฉันเชื่อว่าการรักษาความปลอดภัย ใครจะหวังว่าผู้อ่านจะตรวจสอบรายละเอียดของคำตอบมากกว่าคัดลอกและวาง แต่ฉันชอบที่จะอยู่ในความเป็นจริงเป็นครั้งคราว
Jordan

4
@Romain ผู้ใช้ที่ติดตั้งเซิร์ฟเวอร์ MySQL นั้นฉลาดพอที่จะรู้ว่าพวกเขาควรแทนที่myuserด้วยชื่อผู้ใช้ที่กำหนดเอง
AStopher

524

นี่เป็นคำถามเก่า แต่ฉันไม่คิดว่าคำตอบที่ยอมรับจะปลอดภัย เป็นการดีสำหรับการสร้างผู้ใช้ระดับสูง แต่ไม่ดีถ้าคุณต้องการให้สิทธิ์ในฐานข้อมูลเดียว

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

%ดูเหมือนว่าจะไม่ครอบคลุมการสื่อสารซ็อกเก็ตที่localhostมีไว้สำหรับ WITH GRANT OPTIONดีสำหรับผู้ใช้ระดับสูงเท่านั้นมิฉะนั้นจะเป็นความเสี่ยงด้านความปลอดภัย

อัปเดตสำหรับ MySQL 5.7+ ดูเหมือนว่ามีคำเตือนเกี่ยวกับ:

การใช้คำสั่ง GRANT เพื่อแก้ไขคุณสมบัติของผู้ใช้ที่มีอยู่นอกเหนือจากสิทธิ์จะถูกคัดค้านและจะถูกลบออกในอนาคต ใช้คำสั่ง ALTER USER สำหรับการดำเนินการนี้

ดังนั้นการตั้งรหัสผ่านควรมีคำสั่งแยกต่างหาก ขอบคุณที่แสดงความคิดเห็นจาก @ scary-wombat

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

หวังว่านี่จะช่วยได้


26
+1 สำหรับไม่รวมWITH GRANT OPTIONและกำหนดเป้าหมายฐานข้อมูลที่ระบุแทนทั้งหมด ( *)
Adonis K. Kakoulidis

@IanBussieres ไวยากรณ์ของ "% ดูเหมือนว่าจะไม่ครอบคลุมการสื่อสารซ็อกเก็ตว่า localhost นั้นใช้สำหรับ" นั้นไม่ชัดเจน สิ่งนี้หมายความว่าอย่างไร
Thufir

2
@Thufir unix socketsค้นหา เมื่อใช้localhostไคลเอนต์ myslq บน linux กำลังพยายามใช้ซ็อกเก็ต unix แทนการเชื่อมต่อ TCP ไปยังเซิร์ฟเวอร์
akostadinov

1
โปรดทราบว่าคุณอาจไม่ต้องการคำสั่งแรกยกเว้นว่าคุณต้องการเข้าถึงจากที่อยู่ IP ภายนอกหรือจากคอมพิวเตอร์เครื่องอื่น ๆ ในเครือข่ายย่อยในท้องถิ่น หากคุณทำเช่นนั้นฉันขอแนะนำให้ใช้คำสั่งที่กำหนดเป้าหมายไปยังที่อยู่ IP เฉพาะที่คุณต้องการอนุญาตเช่น myuser@192.168.0.1 (สำหรับคำสั่งหนึ่งในเครือข่ายย่อยท้องถิ่น) แทนที่จะเป็น myuser @% โดยทั่วไป
Evan Donovan

1
mysql> ALTER USER 'root' @ 'localhost' ระบุโดย 'new_password';
Wombat น่ากลัว

121

สิ่งนี้จะเป็นประโยชน์สำหรับบางคน:

จากบรรทัดคำสั่ง MySQL:

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

น่าเสียดายที่ ณ จุดนี้ผู้ใช้ใหม่ไม่มีสิทธิ์ในการทำอะไรกับฐานข้อมูล ในความเป็นจริงหากผู้ใช้ใหม่พยายามเข้าสู่ระบบ (ด้วยรหัสผ่านรหัสผ่าน) พวกเขาจะไม่สามารถเข้าถึงเปลือก MySQL ได้

ดังนั้นสิ่งแรกที่ต้องทำคือให้ผู้ใช้สามารถเข้าถึงข้อมูลที่ต้องการได้

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

เครื่องหมายดอกจันในคำสั่งนี้อ้างถึงฐานข้อมูลและตาราง (ตามลำดับ) ที่พวกเขาสามารถเข้าถึง - คำสั่งเฉพาะนี้ช่วยให้ผู้ใช้สามารถอ่านแก้ไขดำเนินการและดำเนินงานทั้งหมดในฐานข้อมูลและตารางทั้งหมด

เมื่อคุณสรุปสิทธิ์ที่คุณต้องการตั้งค่าสำหรับผู้ใช้ใหม่ของคุณแล้วให้แน่ใจว่าได้โหลดสิทธิ์ทั้งหมดใหม่ทั้งหมด

FLUSH PRIVILEGES;

การเปลี่ยนแปลงของคุณจะมีผล

สำหรับข้อมูลเพิ่มเติม: http://dev.mysql.com/doc/refman/5.6/th/grant.html

หากคุณไม่สะดวกกับบรรทัดคำสั่งคุณสามารถใช้ไคลเอนต์เช่นMySQL workbench , NavicatหรือSQLyog


5
flush privilegesไม่จำเป็นเมื่อคุณใช้grantคำสั่ง x4
Pacerier

1
ไม่ว่าคุณจะคัดลอกมาจาก Linode หรือไม่ก็คัดลอกมาจากคุณ: linode.com/docs/database/mysql/?hl=th

ฉันต้องระบุอีกครั้งด้วยGRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost' IDENTIFIED BY 'my_password' WITH GRANT OPTION;(แปลก ... แต่จริง)
rubo77

30

 1. สร้างฐานข้อมูล

CREATE DATABASE db_name;

 2. สร้างชื่อผู้ใช้สำหรับฐานข้อมูล db_name

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

 3. ใช้ฐานข้อมูล

USE db_name;

 4. ในที่สุดคุณก็อยู่ในฐานข้อมูล db_name แล้วดำเนินการคำสั่งเช่นสร้างเลือกและแทรกการดำเนินการ


วันนี้สิ่งนี้ทำให้ฉันได้รับคำเตือน "การใช้คำสั่ง GRANT เพื่อแก้ไขคุณสมบัติของผู้ใช้ที่มีอยู่นอกเหนือจากสิทธิ์จะเลิกใช้และจะถูกลบออกในรุ่นอนาคตใช้คำสั่ง ALTER USER สำหรับการดำเนินการนี้" ดังนั้นฉันควรเข้าใจว่าฉันควรสร้างผู้ใช้จากนั้นให้สิทธิ์ตอนนี้
felwithe

คุณจะบอก MySQL ได้อย่างไรว่าusernameควรมีสิทธิ์ทั้งหมดdb_nameแต่ไม่ได้DROP db_name;รับสิทธิ์
tonix

21

SQL นี้มอบให้กับฐานข้อมูลทั้งหมด แต่เป็นเพียงสิทธิ์พื้นฐาน พวกเขาเพียงพอสำหรับ Drupal หรือ Wordpress และในฐานะที่เป็นประโยชน์จะอนุญาตบัญชีผู้พัฒนาบัญชีเดียวสำหรับโครงการในท้องถิ่น

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


15

ฉันสามารถทำให้มันทำงานได้โดยการเพิ่มเท่านั้นโดยที่GRANT OPTIONไม่ได้รับอนุญาตถูกปฏิเสธข้อผิดพลาด

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

14

สวัสดีฉันใช้รหัสนี้เพื่อมีผู้ใช้ขั้นสูงใน 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;

แล้ว

FLUSH PRIVILEGES;

11
flush privilegesไม่จำเป็นเมื่อคุณใช้grantคำสั่ง x4
Pacerier

หมายเหตุ: รายการที่แน่นอนในGRANTรุ่นที่แตกต่างกันระหว่าง MySQL
Rick James

6

เพื่อเข้าถึงจากเซิร์ฟเวอร์ระยะไกลไปยังฐานข้อมูล mydb เท่านั้น

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

เพื่อเข้าถึงจากเซิร์ฟเวอร์ระยะไกลไปยังฐานข้อมูลทั้งหมด

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

4

ในการให้สิทธิ์ priveleges ทั้งหมดบนฐานข้อมูล: mydbให้กับผู้ใช้: myuserเพียงดำเนินการ:

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

หรือ:

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

PRIVILEGESคำหลักที่ไม่จำเป็น

นอกจากนี้ฉันไม่ทราบว่าทำไมคำตอบอื่น ๆ แนะนำว่าIDENTIFIED BY 'password'ให้วางที่ส่วนท้ายของคำสั่ง ฉันเชื่อว่ามันไม่จำเป็น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.