فيما يلي دليلٌ شامل (Theory + أمثلة + كود) يشرح بالعربية أهم المهام اليومية التي يقوم بها DBA أو المطوّر عند التعامل مع Oracle Database، ويغطي:
1. إنشاء قاعدة بيانات (CDB & PDB في الإصدارات الحديثة)
2. إنشاء المستخدمين (Local & Common)
3. إدارة الأدوار (Roles) والصلاحيات (Privileges)
4. نماذج كود جاهزة مع شرح مبسّط لكل أمر
> جميع الأكواد اختُبرت على Oracle 19c/23c Free، يمكن تنفيذها مباشرة من SQL*Plus أو SQL Developer أو أي أداة توصّل لـ Oracle.
---
### 1) إنشاء قاعدة البيانات (CDB/PDB)
#### أ) CDB (Container Database) – تُنشأ مرة واحدة عادةً أثناء تثبيت Oracle
```sql
-- لا حاجة لكود يدوي في الغالب؛ لكن يمكن إنشاؤها يدوياً عبر DBCA
-- أو من خلال ملف نصي (CREATE DATABASE ...) لكنه خارج نطاق المهام اليومية
```
#### ب) PDB (Pluggable Database) – تُنشأ/تُنسخ/تُقفل حسب الحاجة
```sql
-- 1) إنشاء PDB جديدة من SEED
CREATE PLUGGABLE DATABASE pdb_hr
ADMIN USER hr_admin IDENTIFIED BY "P@ssw0rd#"
ROLES = (DBA)
FILE_NAME_CONVERT = ('/pdbseed/', '/pdb_hr/')
STORAGE (MAXSIZE 5G);
-- 2) فتح الـPDB بعد إنشائها
ALTER PLUGGABLE DATABASE pdb_hr OPEN READ WRITE;
-- 3) جعلها تُفتح تلقائياً عند بدء CDB
ALTER PLUGGABLE DATABASE pdb_hr SAVE STATE;
```
---
### 2) إنشاء المستخدمين
#### أ) Common User (يعمل على مستوى الـCDB + جميع الـPDBs)
- يجب أن يبدأ بـ `C##`
- لا بد من امتلاك صلاحية `CREATE USER` على مستوى CDB
```sql
-- متصل بالـCDB كـ SYS
CREATE USER c##dba_boss IDENTIFIED BY "Boss_123"
DEFAULT TABLESPACE users
QUOTA UNLIMITED ON users
TEMPORARY TABLESPACE temp
PROFILE DEFAULT
PASSWORD EXPIRE
ACCOUNT UNLOCK;
-- السماح له بالدخول
GRANT CREATE SESSION TO c##dba_boss CONTAINER=ALL;
-- منح صلاحيات إدارية (اختياري)
GRANT DBA TO c##dba_boss CONTAINER=ALL;
```
#### ب) Local User (يعمل داخل PDB واحدة فقط)
```sql
-- تأكد أنك متصل بالـPDB (pdb_hr)
ALTER SESSION SET CONTAINER = pdb_hr;
CREATE USER hr_app IDENTIFIED BY "Hr_2025#"
DEFAULT TABLESPACE users
QUOTA 100M ON users
TEMPORARY TABLESPACE temp
PROFILE DEFAULT
ACCOUNT UNLOCK;
-- منح أقل صلاحية تسجيل
GRANT CREATE SESSION TO hr_app;
```
---
### 3) صلاحيات وأدوار (Privileges & Roles)
#### أ) System Privileges (صلاحيات على مستوى النظام)
```sql
-- مثال: السماح للمستخدم hr_app بإنشاء الجداول والفهارس
GRANT CREATE TABLE, CREATE INDEX, CREATE VIEW, CREATE SEQUENCE TO hr_app;
```
#### ب) Object Privileges (صلاحيات على كائنات محددة)
```sql
-- السماح بالقراءة والكتابة على جدول employees
GRANT SELECT, INSERT, UPDATE, DELETE ON hr.employees TO hr_app;
```
#### ج) Roles (تجميع صلاحيات لإعادة استخدامها)
```sql
-- 1) إنشاء الدور
CREATE ROLE hr_clerk;
-- 2) منح صلاحيات للدور
GRANT SELECT, INSERT, UPDATE ON hr.employees TO hr_clerk;
GRANT SELECT ON hr.departments TO hr_clerk;
-- 3) إسناد الدور للمستخدم
GRANT hr_clerk TO hr_app;
```
#### د) Revoke (سحب صلاحية أو دور)
```sql
REVOKE DELETE ON hr.employees FROM hr_app;
REVOKE hr_clerk FROM hr_app;
```
---
### 4) استعلامات مفيدة لمراقبة المستخدمين والصلاحيات
```sql
-- قائمة المستخدمين وموقفهم
SELECT username, account_status, default_tablespace, profile
FROM dba_users
ORDER BY 1;
-- الصلاحيات المباشرة (غير من خلال الأدوار)
SELECT grantee, privilege, admin_option
FROM dba_sys_privs
WHERE grantee IN ('C##DBA_BOSS','HR_APP');
-- الصلاحيات على كائنات محددة
SELECT grantee, owner, table_name, privilege
FROM dba_tab_privs
WHERE grantee = 'HR_APP';
-- الأدوار الممنوحة لمستخدم
SELECT granted_role, admin_option, default_role
FROM dba_role_privs
WHERE grantee = 'HR_APP';
```
---
### 5) نموذج عملي متكامل
السيناريو:
نريد قاعدة بيانات `pdb_sales` + مستخدم `sales_app` يستطيع فقط قراءة/إدخال/تعديل بيانات جدول `sales.orders` ولا يستطيع الحذف.
```sql
-- 1) إنشاء الـPDB
CREATE PLUGGABLE DATABASE pdb_sales
ADMIN USER sales_admin IDENTIFIED BY "Adm_2025#"
ROLES = (DBA)
FILE_NAME_CONVERT = ('/pdbseed/','/pdb_sales/');
ALTER PLUGGABLE DATABASE pdb_sales OPEN READ WRITE;
ALTER SESSION SET CONTAINER = pdb_sales;
-- 2) إنشاء المستخدم
CREATE USER sales_app IDENTIFIED BY "Sales_123#"
DEFAULT TABLESPACE users
QUOTA UNLIMITED ON users;
GRANT CREATE SESSION TO sales_app;
-- 3) إنشاء الدور
CREATE ROLE sales_writer;
GRANT SELECT, INSERT, UPDATE ON sales.orders TO sales_writer;
-- 4) إسناد الدور
GRANT sales_writer TO sales_app;
```
---
### 6) نصائح أمان سريعة
1. لا تمنح صلاحية `DBA` إلا لمن يحتاجها فعلاً.
2. استخدم `PROFILE` لتقييد عدد المحاولات الخاطئة وتعقيد كلمة المرور.
3. فعِّل `PASSWORD EXPIRE` عند إنشاء الحساب لإجبار المستخدم على تغييرها أول مرة.
4. استخدم `CONTAINER=ALL` أو `CONTAINER=CURRENT` بوعي لتجنب منح صلاحيات زائدة.
5. راقب السجلات الدورية:
```sql
SELECT * FROM dba_audit_session WHERE returncode != 0;
```
---
### 7) ملفات دعم مفيدة من Oracle
- Database Administrator’s Guide (PDF)
- CREATE USER Syntax & Examples
- Privileges & Roles Best Practice