MySQL có một hệ thống truy cập cơ sở dữ liệu nâng cao. Người dùng cơ sở dữ liệu có thể có quyền truy cập vào toàn bộ cơ sở dữ liệu, các bảng riêng biệt hoặc các cột riêng biệt của bảng. Ngoài ra, có một hạn chế đối với các hành động mà người dùng có thể thực hiện với các bản ghi
Máy chủ MySQL sử dụng một số bảng trong cơ sở dữ liệu đặc biệt để tổ chức cấu trúc truy cập cơ sở dữ liệu phức tạp như vậy. Chính sách truy cập dựa trên các giá trị có sẵn trong các bảng này
Cơ sở dữ liệu mà máy chủ MySQL sử dụng để lưu trữ dữ liệu nội bộ về người dùng được gọi là mysql theo mặc định. Có các bảng để lưu trữ thông tin về tài khoản của người dùng trong cơ sở dữ liệu này
- người dùng chứa danh sách tất cả người dùng máy chủ MySQL và quyền truy cập cơ sở dữ liệu của họ;
- db chứa một danh sách các cơ sở dữ liệu với danh sách người dùng cơ sở dữ liệu phù hợp và các đặc quyền của họ để thực thi các hoạt động;
- table_priv chứa danh sách các bảng cơ sở dữ liệu [dạng xem] mà người dùng có quyền truy cập;
- cột_priv chứa danh sách các cột từ bảng cơ sở dữ liệu [dạng xem] mà người dùng có quyền truy cập;
- procs_priv chứa danh sách các thủ tục [chức năng] cơ sở dữ liệu mà người dùng có quyền truy cập
Để lấy danh sách các đặc quyền của người dùng liên quan đến truy cập dữ liệu, có thể thực hiện các truy vấn sau
- danh sách các đặc quyền toàn cầu
SELECT mu.host `Host`, mu.user `User`, REPLACE[RTRIM[CONCAT[ IF[mu.Select_priv = 'Y', 'Select ', ''], IF[mu.Insert_priv = 'Y', 'Insert ', ''], IF[mu.Update_priv = 'Y', 'Update ', ''], IF[mu.Delete_priv = 'Y', 'Delete ', ''], IF[mu.Create_priv = 'Y', 'Create ', ''], IF[mu.Drop_priv = 'Y', 'Drop ', ''], IF[mu.Reload_priv = 'Y', 'Reload ', ''], IF[mu.Shutdown_priv = 'Y', 'Shutdown ', ''], IF[mu.Process_priv = 'Y', 'Process ', ''], IF[mu.File_priv = 'Y', 'File ', ''], IF[mu.Grant_priv = 'Y', 'Grant ', ''], IF[mu.References_priv = 'Y', 'References ', ''], IF[mu.Index_priv = 'Y', 'Index ', ''], IF[mu.Alter_priv = 'Y', 'Alter ', ''], IF[mu.Show_db_priv = 'Y', 'Show_db ', ''], IF[mu.Super_priv = 'Y', 'Super ', ''], IF[mu.Create_tmp_table_priv = 'Y', 'Create_tmp_table ', ''], IF[mu.Lock_tables_priv = 'Y', 'Lock_tables ', ''], IF[mu.Execute_priv = 'Y', 'Execute ', ''], IF[mu.Repl_slave_priv = 'Y', 'Repl_slave ', ''], IF[mu.Repl_client_priv = 'Y', 'Repl_client ', ''], IF[mu.Create_view_priv = 'Y', 'Create_view ', ''], IF[mu.Show_view_priv = 'Y', 'Show_view ', ''], IF[mu.Create_routine_priv = 'Y', 'Create_routine ', ''], IF[mu.Alter_routine_priv = 'Y', 'Alter_routine ', ''], IF[mu.Create_user_priv = 'Y', 'Create_user ', ''], IF[mu.Event_priv = 'Y', 'Event ', ''], IF[mu.Trigger_priv = 'Y', 'Trigger ', ''] ]], ' ', ', '] AS `Privileges` FROM mysql.user mu ORDER BY mu.Host, mu.User
- danh sách các đặc quyền cho một cơ sở dữ liệu
SELECT md.host `Host`, md.user `User`, md.db `Database`, REPLACE[RTRIM[CONCAT[ IF[md.Select_priv = 'Y', 'Select ', ''], IF[md.Insert_priv = 'Y', 'Insert ', ''], IF[md.Update_priv = 'Y', 'Update ', ''], IF[md.Delete_priv = 'Y', 'Delete ', ''], IF[md.Create_priv = 'Y', 'Create ', ''], IF[md.Drop_priv = 'Y', 'Drop ', ''], IF[md.Grant_priv = 'Y', 'Grant ', ''], IF[md.References_priv = 'Y', 'References ', ''], IF[md.Index_priv = 'Y', 'Index ', ''], IF[md.Alter_priv = 'Y', 'Alter ', ''], IF[md.Create_tmp_table_priv = 'Y', 'Create_tmp_table ', ''], IF[md.Lock_tables_priv = 'Y', 'Lock_tables ', ''], IF[md.Create_view_priv = 'Y', 'Create_view ', ''], IF[md.Show_view_priv = 'Y', 'Show_view ', ''], IF[md.Create_routine_priv = 'Y', 'Create_routine ', ''], IF[md.Alter_routine_priv = 'Y', 'Alter_routine ', ''], IF[md.Execute_priv = 'Y', 'Execute ', ''], IF[md.Event_priv = 'Y', 'Event ', ''], IF[md.Trigger_priv = 'Y', 'Trigger ', ''] ]], ' ', ', '] AS `Privileges` FROM mysql.db md ORDER BY md.Host, md.User, md.Db
- danh sách các đặc quyền cho các bảng
SELECT mt.host `Host`, mt.user `User`, CONCAT[mt.Db, '.', mt.Table_name] `Tables`, REPLACE[mt.Table_priv, ',', ', '] AS `Privileges` FROM mysql.tables_priv mt WHERE mt.Table_name IN [SELECT DISTINCT t.table_name `tables` FROM information_schema.tables AS t WHERE t.table_type IN ['BASE TABLE', 'SYSTEM VIEW', 'TEMPORARY', ''] OR t.table_type 'VIEW' AND t.create_options IS NOT NULL ] ORDER BY mt.Host, mt.User, mt.Db, mt.Table_name;
- danh sách các đặc quyền cho chế độ xem
SELECT mv.host `Host`, mv.user `User`, CONCAT[mv.Db, '.', mv.Table_name] `Views`, REPLACE[mv.Table_priv, ',', ', '] AS `Privileges` FROM mysql.tables_priv mv WHERE mv.Table_name IN [SELECT DISTINCT v.table_name `views` FROM information_schema.views AS v ] ORDER BY mv.Host, mv.User, mv.Db, mv.Table_name;
- danh sách các đặc quyền cho các cột trong bảng
SELECT mtc.host `Host`, mtc.user `User`, CONCAT[mtc.Db, '.', mtc.Table_name, '.', mtc.Column_name] `Tables Columns`, REPLACE[mtc.Column_priv, ',', ', '] AS `Privileges` FROM mysql.columns_priv mtc WHERE mtc.Table_name IN [SELECT DISTINCT t.table_name `tables` FROM information_schema.tables AS t WHERE t.table_type IN ['BASE TABLE', 'SYSTEM VIEW', 'TEMPORARY', ''] OR t.table_type 'VIEW' AND t.create_options IS NOT NULL ] ORDER BY mtc.Host, mtc.User, mtc.Db, mtc.Table_name, mtc.Column_name;
- danh sách các đặc quyền để xem các cột
SELECT mvc.host `Host`, mvc.user `User`, CONCAT[mvc.Db, '.', mvc.Table_name, '.', mvc.Column_name] `Views Columns`, REPLACE[mvc.Column_priv, ',', ', '] AS `Privileges` FROM mysql.columns_priv mvc WHERE mvc.Table_name IN [SELECT DISTINCT v.table_name `views` FROM information_schema.views AS v ] ORDER BY mvc.Host, mvc.User, mvc.Db, mvc.Table_name, mvc.Column_name;
- danh sách các đặc quyền cho các thủ tục
SELECT mp.host `Host`, mp.user `User`, CONCAT[mp.Db, '.', mp.Routine_name] `Procedures`, REPLACE[mp.Proc_priv, ',', ', '] AS `Privileges` FROM mysql.procs_priv mp WHERE mp.Routine_type = 'PROCEDURE' ORDER BY mp.Host, mp.User, mp.Db, mp.Routine_name;
- danh sách các đặc quyền cho các chức năng
SELECT mf.host `Host`, mf.user `User`, CONCAT[mf.Db, '.', mf.Routine_name] `Procedures`, REPLACE[mf.Proc_priv, ',', ', '] AS `Privileges` FROM mysql.procs_priv mf WHERE mf.Routine_type = 'FUNCTION' ORDER BY mf.Host, mf.User, mf.Db, mf.Routine_name;
Bạn có thể cần tạo một báo cáo có thể in được với dữ liệu này và cung cấp báo cáo đó dưới dạng báo cáo, chẳng hạn như theo yêu cầu của khách hàng hoặc cơ quan có thẩm quyền. Với mục đích này, bạn có thể sử dụng công cụ MySQL GUI đặc biệt bao gồm trình thiết kế báo cáo dữ liệu
Nếu bạn đã sẵn sàng truy vấn, bạn có thể tận dụng lợi thế của trình hướng dẫn dễ sử dụng và tạo báo cáo bằng cách sử dụng mẫu được xác định trước và dữ liệu được nhóm, chẳng hạn như theo máy chủ, trong vài phút
Như bạn có thể thấy trên các ảnh chụp màn hình này, chúng tôi đã tạo một báo cáo bằng trình hướng dẫn của dbForge Studio mà không cần thiết kế báo cáo một cách tẻ nhạt
Phần kết luận
Trong bài viết, chúng tôi đã mô tả bằng các tập lệnh cụ thể cách lấy danh sách các đặc quyền của người dùng liên quan đến truy cập dữ liệu