
در دنیای امروز که امنیت دادهها بیش از هر زمان دیگری اهمیت دارد، اوراکل قابلیتی به نام Row-Level Security را از طریق پکیج قدرتمند DBMS_RLS ارائه کرده است.
این ابزار به ما اجازه میدهد که کنترل بسیار دقیقی بر روی دسترسی کاربران به ردیفهای اطلاعاتی در جدولها داشته باشیم، بدون اینکه مجبور باشیم ساختار پایگاه داده یا کوئریهای کاربران را تغییر بدهیم.
در این مقاله آموزش Oracle در بخش آموزش پکیج های اوراکلی میخواهیم به زبان ساده، کاربرد این پکیج را همراه با مثال عملی آموزش دهیم.
پس اگر در زمینهی Oracle کار میکنید و دنبال افزایش امنیت دیتا هستید، این مقاله دقیقاً همان چیزی است که نیاز دارید.
آیا میخواهید بدانید که در اوراکل چگونه می توان ساختار جدول را تغییر داد بدون اینکه سرویس اوراکل متوقف شود، پیشنهاد می شود نوشته زیر را مطالعه کنید:
در این نوشته شما می خوانید
🔍 DBMS_RLS چیست و چه کاری انجام میدهد؟
پکیج DBMS_RLS یکی از ابزارهای امنیتی پیشرفته در Oracle است که به شما اجازه میدهد تا امنیت سطح ردیف (Row-Level Security) را بر روی جداول یا ویوها اعمال کنید.
به زبان ساده، با این قابلیت میتوانید تعریف کنید که چه کاربری چه رکوردهایی را در یک جدول خاص ببیند یا تغییر دهد.
📦 چه امکاناتی در DBMS_RLS وجود دارد؟
Oracle این پکیج را با مجموعهای از توابع و رویههای مدیریتی ارائه داده که مهمترین آنها عبارتند از:
ADD_POLICY– تعریف سیاست دسترسیDROP_POLICY– حذف سیاستENABLE_POLICY/DISABLE_POLICY– فعال یا غیرفعال کردن سیاستUPDATE_POLICY– بروزرسانی سیاست موجودADD_GROUPED_POLICY– ایجاد سیاستهای گروهی (در نسخههای جدید اوراکل)
🧪 یک مثال واقعی از استفاده DBMS_RLS در Oracle
فرض کنید ما یک جدول به نام employees داریم و میخواهیم کاربر فقط اطلاعات کارمندان مربوط به شهر خودش را مشاهده کند.
اطلاعات شهر کاربر را از طریق پارامتر CLIENT_IDENTIFIER در session ذخیره میکنیم.
۱. تابع سیاست را میسازیم:
CREATE OR REPLACE FUNCTION emp_policy_fn (
schema_name IN VARCHAR2,
table_name IN VARCHAR2
) RETURN VARCHAR2
IS
BEGIN
RETURN 'city = SYS_CONTEXT(''USERENV'', ''CLIENT_IDENTIFIER'')';
END;
/
۲. سیاست دسترسی را اضافه میکنیم:
BEGIN
DBMS_RLS.ADD_POLICY(
object_schema => 'HR',
object_name => 'EMPLOYEES',
policy_name => 'emp_city_policy',
function_schema => 'HR',
policy_function => 'emp_policy_fn',
statement_types => 'SELECT',
enable => TRUE
);
END;
/
۳. حالا وقتی session تنظیم شود:
BEGIN
DBMS_SESSION.SET_IDENTIFIER('TEHRAN');
END;
SELECT * FROM HR.EMPLOYEES;
فقط کارمندانی که در شهر TEHRAN هستند نمایش داده میشوند.
⚙️ چه پارامترهایی در ADD_POLICY مهم هستند؟
| پارامتر | توضیح |
|---|---|
| object_schema | اسکیمای مالک جدول یا ویو |
| object_name | نام جدول یا ویو |
| policy_name | نام یکتای سیاست |
| function_schema | اسکیمای تابع امنیتی |
| policy_function | نام تابعی که شرط WHERE را برمیگرداند |
| statement_types | اعمال سیاست روی SELECT، INSERT، UPDATE، DELETE |
| update_check | بررسی مجدد شرط در زمان UPDATE |
| enable | فعال یا غیرفعال بودن اولیه سیاست |
🔐 نکات امنیتی مهم برای استفاده از DBMS_RLS
- از اجرای دستورات DML (مثل INSERT یا UPDATE) داخل تابع امنیتی خودداری کنید.
- تابع RLS فقط باید یک شرط برگشتی
WHEREداشته باشد و هیچ تاثیر جانبی (side effect) نداشته باشد. - اگر از ویژگیهایی مثل edition-based deployment استفاده میکنید، نسخه تابع اهمیت پیدا میکند.
- استفاده از
SYS_CONTEXTبسیار رایج و توصیهشده است.
⚡ پیشنهاداتی برای بهینهسازی عملکرد:
- سیاست RLS را فقط برای دستورات ضروری (مثلاً فقط SELECT) اعمال کنید.
- در توابع امنیتی از کوئریهای پیچیده و کند پرهیز کنید.
- برای جداول حجیم از partitioning منطقی به همراه RLS استفاده کنید تا فشار بر سیستم کاهش یابد.
📚 موارد استفاده رایج از DBMS_RLS
- سامانههای چندمستاجره (multi-tenant)
- سیستمهای سازمانی با چندین سطح دسترسی
- تفکیک رکوردها بدون نیاز به ساخت جداول متعدد برای هر گروه کاربر
- محدودسازی دسترسی براساس نقش، منطقه جغرافیایی، یا پارامترهای محیطی
سوالات متداول درباره پکیج DBMS_RLS در Oracle
بله. شما میتوانید چندین سیاست (Policy) روی یک جدول یا ویو اعمال کنید.
Oracle تمام این سیاستها را با هم AND میکند و فقط ردیفهایی نمایش داده میشوند که تمام شرایط برقرار باشد.
اگر نیاز به رفتار متفاوت دارید، میتوانید از سیاستهای گروهی (Grouped Policies) در Oracle 12c به بعد استفاده کنید.
بله. اما به صورت پیشفرض فقط برای SELECT اعمال میشود مگر اینکه صراحتاً در پارامتر statement_types گزینههای INSERT, UPDATE, DELETE را نیز اضافه کنید.
برای هر نوع عملیات میتوانید شرط متفاوتی بنویسید (با تعریف سیاست جداگانه یا تابع پیچیدهتر).
در برخی شرایط بله. چون Oracle باید برای هر کوئری تابع RLS را اجرا کند.
اگر جدول بزرگ باشد یا تابع RLS پیچیده باشد (مثلاً شامل Subquery یا Join)، ممکن است تأثیر منفی روی performance بگذارد.
توصیه میشود توابع سبک و بهینه بنویسید و تنها در صورت نیاز به RLS متوسل شوید.
در واقع DBMS_RLS همان هستهای است که VPD را در Oracle پیادهسازی میکند.
وقتی شما از VPD استفاده میکنید، در پشت صحنه از DBMS_RLS.ADD_POLICY برای اعمال سیاستها استفاده میشود.
پس میتوان گفت DBMS_RLS ابزار پاییندستی (low-level) برای پیادهسازی VPD است و کنترل بیشتری به توسعهدهنده میدهد.
📦 جمعبندی
استفاده از پکیج DBMS_RLS در Oracle به شما این امکان را میدهد که بدون دردسر و تغییرات زیاد در ساختار برنامه، کنترل دقیقی روی دادهها اعمال کنید.
اگر در سازمانی هستید که امنیت دادهها اولویت بالایی دارد، استفاده از این پکیج میتواند بهترین راهکار باشد.
📥 اگر سوالی داری در موردپکیج DBMS_RLS در Oracle داری، در بخش کامنتها بپرس.
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید