สร้างผู้ใช้ใหม่ใน MySQL และให้สิทธิ์การเข้าถึงฐานข้อมูลเดียว


628

ผมต้องการสร้างผู้ใช้ใหม่ใน MySQL และให้การเข้าถึงแบบเต็มไปยังฐานข้อมูลเพียงหนึ่งบอกว่าที่ผมสร้างขึ้นด้วยคำสั่งเช่นdbTest create database dbTest;MySQL มีคำสั่งให้ทำเช่นไร?

คำตอบ:


829

ลองใช้วิธีนี้เพื่อสร้างผู้ใช้:

CREATE USER 'user'@'hostname';

ลองใช้วิธีนี้เพื่อให้สิทธิ์การเข้าถึงฐานข้อมูลdbTest:

GRANT ALL PRIVILEGES ON dbTest.* To 'user'@'hostname' IDENTIFIED BY 'password';

หากคุณใช้รหัส / ไซต์ที่เข้าถึง MySQL บนเครื่องเดียวกันชื่อโฮสต์จะเป็น localhost

ทีนี้การพังทลาย

GRANT - นี่คือคำสั่งที่ใช้ในการสร้างผู้ใช้และให้สิทธิ์ในฐานข้อมูลตาราง ฯลฯ

ALL PRIVILEGES- สิ่งนี้บอกว่าผู้ใช้จะมีสิทธิ์มาตรฐานทั้งหมด ซึ่งไม่รวมถึงสิทธิ์ในการใช้คำสั่ง GRANT

dbtest.*- คำแนะนำนี้ MySQL จะใช้สิทธิ์เหล่านี้เพื่อใช้ในฐานข้อมูล dbtest ทั้งหมด คุณสามารถแทนที่ * ด้วยชื่อตารางที่ระบุหรือรูทีนการจัดเก็บได้ตามต้องการ

TO 'user'@'hostname'- 'ผู้ใช้' คือชื่อผู้ใช้ของบัญชีผู้ใช้ที่คุณกำลังสร้าง หมายเหตุ: คุณต้องมีเครื่องหมายคำพูดเดี่ยวในนั้น 'ชื่อโฮสต์' จะบอก MySQL ว่าโฮสต์ใดที่ผู้ใช้สามารถเชื่อมต่อได้ หากคุณต้องการจากเครื่องเดียวกันให้ใช้localhost

IDENTIFIED BY 'password' - ตามที่คุณคาดเดาได้ชุดรหัสผ่านสำหรับผู้ใช้นั้น


82
หากคุณอนุญาตให้เข้าถึงเครือข่ายและต้องการเชื่อมต่อจากโฮสต์ใด ๆ คุณสามารถเปลี่ยน 'ชื่อโฮสต์' เป็น '%' ตัวอย่างเช่น ... TO 'dbuser' @ '%' IDENTIFIED ... '%' เป็นสัญลักษณ์ตัวแทนของโฮสต์
physicsmichael

17
อย่าลืมลบสิทธิ์เมื่อคุณทำงานกับผู้ใช้และตาราง! :-)
corsiKa

31
สิ่งนี้ใช้ได้สำหรับฉัน: สร้างผู้ใช้ 'user1' @ 'localhost' ระบุโดย 'รหัสผ่าน'; ให้สิทธิ์ทั้งหมดบน db_database1. * เป็น 'user1' @ 'localhost' ที่ระบุโดย 'รหัสผ่าน'; สิทธิในการชำระล้าง
Mohamad Fakih

4
@DanMcGrath: มีการระบุด้วยประโยค 'รหัสผ่าน' หากผู้ใช้มีอยู่แล้วและมีรหัสผ่านหรือไม่
nanosoft

8
การใช้ GRANT เพื่อสร้างผู้ใช้ใหม่จะถูกลบออกในรุ่นอนาคตของ MySQL (จะเลิกใช้ในขณะที่เขียนนี้) ในอนาคตจะต้องทำการโทรออกสองครั้ง CREATE USER และ GRANT
Darren Felton

325

วากยสัมพันธ์

เพื่อสร้างผู้ใช้ใน MySQL / MariaDB 5.7.6 และสูงกว่าให้ใช้CREATE USERไวยากรณ์ :

CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'new_password';

จากนั้นให้สิทธิ์การเข้าถึงฐานข้อมูลทั้งหมด (เช่นmy_db) ใช้GRANTไวยากรณ์เช่น

GRANT ALL ON my_db.* TO 'new_user'@'localhost';

อยู่ที่ไหนALL( priv_type ) สามารถถูกแทนที่ด้วยสิทธิพิเศษที่เฉพาะเจาะจงเช่นSELECT, INSERT, UPDATE, ALTERฯลฯ

จากนั้นเมื่อต้องการโหลดสิทธิ์ที่กำหนดใหม่ให้รัน

FLUSH PRIVILEGES;

การดำเนินการ

เมื่อต้องการเรียกใช้คำสั่งดังกล่าวข้างต้นคุณจะต้องเรียกใช้mysqlคำสั่งและพิมพ์ลงในพร้อมท์แล้วออกจากระบบโดยquitคำสั่งหรือ-CtrlD

ในการรันจาก shell ให้ใช้-eพารามิเตอร์ (แทนที่SELECT 1ด้วยหนึ่งในคำสั่งด้านบน):

$ mysql -e "SELECT 1"

หรือพิมพ์คำสั่งจากอินพุตมาตรฐาน:

$ echo "FOO STATEMENT" | mysql

หากคุณมีAccess ถูกปฏิเสธด้วยด้านบนให้ระบุพารามิเตอร์-u(สำหรับผู้ใช้) และ-p(สำหรับรหัสผ่าน) หรือสำหรับการเข้าถึงระยะยาวตั้งค่าข้อมูลรับรองของคุณ~/.my.cnfเช่น

[client]
user=root
password=root

การรวมเชลล์

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

นี่คือตัวอย่าง:

$ mysql-create-user admin mypass
| CREATE USER 'admin'@'localhost' IDENTIFIED BY 'mypass'

$ mysql-create-db foo
| CREATE DATABASE IF NOT EXISTS foo

$ mysql-grant-db admin foo
| GRANT ALL ON foo.* TO 'admin'@'localhost'
| FLUSH PRIVILEGES

$ mysql-show-grants admin
| SHOW GRANTS FOR 'admin'@'localhost'
| Grants for admin@localhost                                                                                   
| GRANT USAGE ON *.* TO 'admin'@'localhost' IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4' |
| GRANT ALL PRIVILEGES ON `foo`.* TO 'admin'@'localhost'

$ mysql-drop-user admin
| DROP USER 'admin'@'localhost'

$ mysql-drop-db foo
| DROP DATABASE IF EXISTS foo

ในการใช้คำสั่งข้างต้นคุณต้องคัดลอกและวางฟังก์ชั่นต่อไปนี้ลงในไฟล์rcของคุณ(เช่น.bash_profile) และโหลดเชลล์หรือโหลดไฟล์ของคุณใหม่ ในกรณีนี้เพียงพิมพ์source .bash_profile:

# Create user in MySQL/MariaDB.
mysql-create-user() {
  [ -z "$2" ] && { echo "Usage: mysql-create-user (user) (password)"; return; }
  mysql -ve "CREATE USER '$1'@'localhost' IDENTIFIED BY '$2'"
}

# Delete user from MySQL/MariaDB
mysql-drop-user() {
  [ -z "$1" ] && { echo "Usage: mysql-drop-user (user)"; return; }
  mysql -ve "DROP USER '$1'@'localhost';"
}

# Create new database in MySQL/MariaDB.
mysql-create-db() {
  [ -z "$1" ] && { echo "Usage: mysql-create-db (db_name)"; return; }
  mysql -ve "CREATE DATABASE IF NOT EXISTS $1"
}

# Drop database in MySQL/MariaDB.
mysql-drop-db() {
  [ -z "$1" ] && { echo "Usage: mysql-drop-db (db_name)"; return; }
  mysql -ve "DROP DATABASE IF EXISTS $1"
}

# Grant all permissions for user for given database.
mysql-grant-db() {
  [ -z "$2" ] && { echo "Usage: mysql-grand-db (user) (database)"; return; }
  mysql -ve "GRANT ALL ON $2.* TO '$1'@'localhost'"
  mysql -ve "FLUSH PRIVILEGES"
}

# Show current user permissions.
mysql-show-grants() {
  [ -z "$1" ] && { echo "Usage: mysql-show-grants (user)"; return; }
  mysql -ve "SHOW GRANTS FOR '$1'@'localhost'"
}

หมายเหตุ: หากคุณไม่ต้องการทิ้งร่องรอย (เช่นรหัสผ่าน) ไว้ในประวัติ Bash ของคุณให้ตรวจสอบ: วิธีป้องกันคำสั่งให้แสดงในประวัติทุบตีได้อย่างไร


1
คุณต้องการสร้างผู้ใช้และให้สิทธิ์แยกต่างหากหรือไม่? ฉันพบว่าคำสั่ง grant ดูเหมือนจะสร้างผู้ใช้เองอย่างน้อยก็ดูในตาราง mysql.user ที่มีหน้าตาแบบนั้น
ทิม

@CreativityKills จะทำงานกับรหัสผ่านหากคุณเพิ่มไว้ใน~/.my.cnfที่แนะนำข้างต้น
kenorb

การทิ้งร่องรอยรหัสผ่านไว้ในประวัติเชลล์ไม่ใช่ความคิดที่ดี
dmirkitanov

@dmirkitanov คุณสามารถป้องกันได้โดยเพิ่มช่องว่างดู: วิธีการป้องกันคำสั่งที่จะแสดงในประวัติทุบตี?
kenorb

58

เพื่อสร้างผู้ใช้และให้สิทธิ์ทั้งหมดในฐานข้อมูล

เข้าสู่ระบบ MySQL:

mysql -u root

ตอนนี้สร้างและให้สิทธิ์

GRANT ALL PRIVILEGES ON dbTest.* To 'user'@'hostname' IDENTIFIED BY 'password';

ผู้ใช้นิรนาม (สำหรับการทดสอบในท้องถิ่นเท่านั้น)

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

GRANT ALL PRIVILEGES ON dbTest.* To ''@'hostname'

ระวัง

นี่เป็นเรื่องปกติสำหรับข้อมูลขยะในการพัฒนา อย่าทำอย่างนี้กับทุกสิ่งที่คุณสนใจ


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

2
หากใครบางคนเข้าถึง macbook ของฉันจากระยะไกลฉันมีสิ่งที่ต้องกังวลมากกว่าเนื้อหาของฐานข้อมูลการพัฒนาของฉัน ฉันควรทบทวนซ้ำนี่เป็นเพียงการทดสอบในท้องถิ่นเท่านั้นอย่าใช้ข้อมูลจริง
superluminary

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

1
บางที. ในกรณีของฉันมันเป็นข้อมูลขยะฉันจะอยู่กับความเสี่ยง
superluminary

17
$ mysql -u root -p -e "grant all privileges on dbTest.* to
`{user}`@`{host}` identified by '{long-password}'; flush privileges;"

ละเว้นตัวเลือก-pหากผู้ใช้ mysql ไม่มีรหัสผ่านหรือเพียงแค่กดปุ่ม "[Enter]" เพื่อบายพาส สตริงที่ล้อมรอบด้วยเครื่องหมายปีกกาจำเป็นต้องแทนที่ด้วยค่าจริง


13

คุณสามารถสร้างผู้ใช้ใหม่โดยใช้ผู้สร้างคำสั่งและให้สิทธิกับพวกเขาโดยใช้GRANT


สร้างผู้ใช้ 'jeffrey' @ 'localhost' ระบุโดย 'mypass';
cgl

6

สำหรับฉันมันใช้งานได้

CREATE USER 'spowner'@'localhost' IDENTIFIED BY '1234'; 
GRANT ALL PRIVILEGES ON test.* To 'spowner'@'localhost'; 
FLUSH PRIVILEGES;

ที่ไหน

  • spowner: ชื่อผู้ใช้
  • 1234: รหัสผ่านของ Spowner
  • ทดสอบ: ฐานข้อมูล 'spowner' มีสิทธิ์เข้าถึง

2

คำสั่งด้านล่างจะทำงานถ้าคุณต้องการสร้างผู้ใช้ใหม่ให้เขาเข้าถึงฐานข้อมูลเฉพาะทั้งหมด (ไม่ใช่ฐานข้อมูลทั้งหมดใน Mysql ของคุณ) บน localhost ของคุณ

GRANT ALL PRIVILEGES ON test_database.* TO 'user'@'localhost' IDENTIFIED BY 'password';

สิ่งนี้จะให้สิทธิ์ทั้งหมดแก่ฐานข้อมูลเดียวtest_database(ในกรณีของคุณdbTest) ให้กับผู้ใช้บน localhost

ตรวจสอบสิทธิ์ที่คำสั่งด้านบนออกให้กับผู้ใช้โดยเรียกใช้คำสั่งด้านล่าง

SHOW GRANTS FOR 'user'@'localhost'

ในกรณีที่ถ้าคุณต้องการ จำกัด การเข้าถึงของผู้ใช้เพียงหนึ่งตารางเดียว

GRANT ALL ON mydb.table_name TO 'someuser'@'host';

ข้อผิดพลาดทางไวยากรณ์ & การพิมพ์ผิดในบรรทัดแรกของคุณ "PRIVILEGES ON 'test_datase'" ไม่ควรมีเครื่องหมายอัญประกาศควรจะมีเครื่องหมาย ". *" หลังจากนั้นเช่น test_datase. * และเป็น typo ควรเป็น "test_database" "
Brettinsin

0

ในกรณีที่hostมีการเว้นส่วนนั้นจะมีการใช้สัญลักษณ์ตัวแทน%เพื่อให้โฮสต์ทั้งหมด

CREATE USER 'service-api';

GRANT ALL PRIVILEGES ON the_db.* TO 'service-api' IDENTIFIED BY 'the_password'

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