Thứ Tư, 25 tháng 2, 2026

MODULE 6: QUẢN TRỊ USER, ROLE VÀ SCHEMA

1. Tổng quan

Với Oracle, nguyên lý cơ bản là User = Schema. Khi anh tạo một User, Oracle tự động tạo một Schema cùng tên để chứa các Object (Table, View, Proc).

Tuy nhiên, khi bước sang SQL Server hay PostgreSQL, khái niệm này bị phá vỡ hoàn toàn. Các hệ thống này tách bạch rõ ràng giữa Người đăng nhập (Login/Role), Người dùng trong DB (User)Vùng chứa đối tượng (Schema).

2. Chi tiết các nội dung

A. Kiến trúc Quản lý Tài khoản (Account Architecture)

CSDLKhái niệm Cấp Instance (Kết nối Server)Khái niệm Cấp Database (Thao tác dữ liệu)Khái niệm Schema (Vùng chứa Object)
OracleUser(Tương đương)Schema tự sinh cùng tên với User.
SQL ServerLogin (Lưu ở DB master)User (Map với Login, lưu ở DB đích)Schema (Logical container, vd: dbo, sales). User và Schema độc lập.
PostgreSQLRole (Cấp Cluster). User bản chất là Role có quyền LOGIN.Role được cấp quyền trên DB cụ thể.Schema (Nằm trong DB, mặc định là public).
MySQLUser@Host (Khóa chặt tài khoản với IP/Dải mạng)Quyền được cấp thẳng trên Database (GRANT ON db.*)Không có Schema thực thụ (Database = Schema).
MongoDBUser (Tạo ở DB admin để quản trị toàn hệ thống)User (Tạo ở DB ứng dụng cụ thể)Không có (Dữ liệu phi cấu trúc). Phân quyền qua RBAC (Role-Based Access Control).

B. Câu lệnh Quản trị & Kết quả đầu ra (Tạo User & Cấp quyền)

1. SQL Server: Phải tạo Login trước, sau đó map vào User

SQL
-- Bước 1: Tạo Login ở cấp Instance (Master DB)
USE master;
CREATE LOGIN app_login WITH PASSWORD = 'StrongPassword123!';

-- Bước 2: Chuyển sang DB ứng dụng, tạo User và phân quyền
USE sopirs_new;
CREATE USER app_user FOR LOGIN app_login;
ALTER ROLE db_datareader ADD MEMBER app_user; -- Cấp quyền đọc toàn bộ DB
ALTER ROLE db_datawriter ADD MEMBER app_user; -- Cấp quyền ghi toàn bộ DB

-- Kết quả: app_login kết nối thành công và thao tác được trên DB sopirs_new.

2. PostgreSQL: Tạo Role và Cấp quyền trên Schema

SQL
-- Tạo Role (Tương đương User) có quyền đăng nhập
CREATE ROLE app_user WITH LOGIN PASSWORD 'StrongPassword123!';

-- Cấp quyền kết nối vào Database
GRANT CONNECT ON DATABASE app_db TO app_user;

-- CHÚ Ý: Chuyển sang kết nối vào app_db trước khi chạy các lệnh sau
GRANT USAGE ON SCHEMA public TO app_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user;

-- Kết quả: CREATE ROLE và GRANT thành công.

3. MySQL / MariaDB: Gắn liền với Mạng (Host)

SQL
-- Tạo user chỉ được phép kết nối từ dải mạng 10.0.0.x
CREATE USER 'app_user'@'10.0.0.%' IDENTIFIED BY 'StrongPassword123!';

-- Cấp quyền trên 1 Database cụ thể
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'10.0.0.%';
FLUSH PRIVILEGES;

-- Kết quả: Query OK, 0 rows affected.

4. MongoDB: RBAC (Role-Based Access Control) chuẩn mực

JavaScript
use app_db;
db.createUser({
  user: "app_user",
  pwd: "StrongPassword123!",
  roles: [ { role: "readWrite", db: "app_db" } ]
})
// Kết quả: Successfully added user: { "user" : "app_user", "roles" : [ ... ] }

5. Oracle (Hệ quy chiếu):

SQL
CREATE USER app_user IDENTIFIED BY StrongPassword123!;
GRANT CONNECT, RESOURCE TO app_user;
-- Chú ý: Từ bản 12c, cần cấp quota cho Tablespace:
ALTER USER app_user QUOTA UNLIMITED ON users;

3. Tóm tắt lại nội dung của bài học

  • Cạm bẫy lớn nhất khi anh chuyển từ Oracle sang SQL Server là lỗi "Orphaned User" (User mồ côi). Khi anh restore Database sang một server khác, User trong Database vẫn còn nhưng Login ở tầng Instance đã mất. Anh phải dùng thủ tục sp_change_users_login để map chúng lại với nhau.

  • Trong PostgreSQL, CREATE USER thực chất chỉ là "bí danh" (alias) của lệnh CREATE ROLE ... WITH LOGIN. Các quyền (Privileges) trong Postgres quản lý rất rạch ròi đến từng Schema, Table, và Function.

  • MySQL rất tiện lợi nhưng cần cẩn thận với khái niệm user@host. app_user@localhostapp_user@% là hai tài khoản hoàn toàn độc lập với mật khẩu và quyền hạn khác nhau.


4. Câu hỏi ôn tập

  1. Hỏi: Trong SQL Server, sự khác biệt giữa LOGINUSER là gì?

    • Đáp: LOGIN dùng để xác thực quyền truy cập vào Server/Instance (lưu ở master). USER là danh tính dùng để thao tác với các Object bên trong một Database cụ thể.

  2. Hỏi: Nếu trong Oracle, Schema và User là một, vậy trong SQL Server thì sao?

    • Đáp: Độc lập hoàn toàn. Một USER có thể được cấp quyền quản lý nhiều SCHEMA (như dbo, hr, sales) trong cùng một Database.

  3. Hỏi: Trong PostgreSQL, khi anh chạy lệnh CREATE ROLE manager; (không có thêm tham số nào), Role này có đăng nhập (login) vào CSDL được không?

    • Đáp: Không. Để đăng nhập được, Role bắt buộc phải được khai báo bằng lệnh CREATE ROLE manager WITH LOGIN; hoặc CREATE USER manager;.

  4. Hỏi: Để khắc phục tình trạng "Orphaned User" trong SQL Server sau khi restore Database, DBA cần làm gì?

    • Đáp: Cần tạo lại LOGIN trên server mới và dùng lệnh ALTER USER [TênUser] WITH LOGIN = [TênLogin] để map (nối) chúng lại với nhau.

  5. Hỏi: Trong MongoDB, nếu muốn tạo một User có quyền tối cao tạo user khác và quản lý toàn bộ hệ thống, ta phải tạo User đó trên Database nào?

    • Đáp: Phải tạo trên Database hệ thống có tên là admin.


5. Bài tập thực hành (Cấp quyền Read-Only)

Đề bài: Trong vận hành thực tế, anh thường xuyên nhận yêu cầu cấp quyền chỉ đọc (Read-Only) cho team Data Analytics/ETL.

Hãy viết script tạo tài khoản report_user với mật khẩu P@ssw0rd2026, chỉ có quyền SELECT trên cơ sở dữ liệu sales_db cho cả 5 hệ thống.

Đáp án:

1. Oracle:

SQL
CREATE USER report_user IDENTIFIED BY P@ssw0rd2026;
GRANT CONNECT TO report_user;
-- Cấp quyền SELECT trên các bảng cụ thể của schema SALES_DB
GRANT SELECT ANY TABLE TO report_user; -- (Cách nhanh nhưng kém an toàn)
-- Hoặc cấp từng bảng: GRANT SELECT ON sales_db.orders TO report_user;

2. SQL Server:

SQL
USE master;
CREATE LOGIN report_user WITH PASSWORD = 'P@ssw0rd2026';
USE sales_db;
CREATE USER report_user FOR LOGIN report_user;
-- Dùng Role có sẵn của hệ thống
ALTER ROLE db_datareader ADD MEMBER report_user;

3. PostgreSQL:

SQL
CREATE ROLE report_user WITH LOGIN PASSWORD 'P@ssw0rd2026';
GRANT CONNECT ON DATABASE sales_db TO report_user;
\c sales_db
GRANT USAGE ON SCHEMA public TO report_user;
-- Cấp quyền SELECT cho tất cả các bảng hiện có
GRANT SELECT ON ALL TABLES IN SCHEMA public TO report_user;
-- Thiết lập mặc định tự cấp quyền SELECT cho các bảng sẽ tạo trong tương lai
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO report_user;

4. MySQL / MariaDB:

SQL
CREATE USER 'report_user'@'%' IDENTIFIED BY 'P@ssw0rd2026';
GRANT SELECT ON sales_db.* TO 'report_user'@'%';
FLUSH PRIVILEGES;

5. MongoDB:

JavaScript
use sales_db;
db.createUser({
  user: "report_user",
  pwd: "P@ssw0rd2026",
  roles: [ { role: "read", db: "sales_db" } ]
})
=============================
TƯ VẤN: Click Here hoặc Hotline/Zalo 090.29.12.888
=============================
Website không chứa bất kỳ quảng cáo nào, mọi đóng góp để duy trì phát triển cho website (donation) xin vui lòng gửi về STK 90.2142.8888 - Ngân hàng Vietcombank Thăng Long - TRAN VAN BINH
=============================
Nếu bạn không muốn bị AI thay thế và tiết kiệm 3-5 NĂM trên con đường trở thành DBA chuyên nghiệp hay làm chủ Database thì hãy đăng ký ngay KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE, được Coaching trực tiếp từ tôi với toàn bộ bí kíp thực chiến, thủ tục, quy trình của gần 20 năm kinh nghiệm (mà bạn sẽ KHÔNG THỂ tìm kiếm trên Internet/Google) từ đó giúp bạn dễ dàng quản trị mọi hệ thống Core tại Việt Nam và trên thế giới, đỗ OCP.
- CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
- Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
2 khóa học online qua video giúp bạn nhanh chóng có những kiến thức nền tảng về Linux, Oracle, học mọi nơi, chỉ cần có Internet/4G:
- Oracle cơ bản: https://bit.ly/admin_1200
- Linux: https://bit.ly/linux_1200
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
cơ sở dữ liệu, cơ sở dữ liệu quốc gia, database, AI, trí tuệ nhân tạo, artificial intelligence, machine learning, deep learning, LLM, ChatGPT, DeepSeek, Grok, oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c/21c/23c/23ai, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, docker, k8s, micro service, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master