ESC را فشار دهید تا بسته شود

زمیوس آموزش، یادگیری و سرگرمی

راهنمای کامل و عملی استفاده از پکیج DBMS_RLS در Oracle برای پیاده‌سازی Row-Level Security

در دنیای امروز که امنیت داده‌ها بیش از هر زمان دیگری اهمیت دارد، اوراکل قابلیتی به نام 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 داری، در بخش کامنت‌ها بپرس.

سؤالی درباره این مقاله داری؟

اگر نکته‌ای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفت‌وگوی واقعی 💬

برو به صفحه پرسش و پاسخ

میثم راد

من یه برنامه نویسم که حسابی با دیتابیس اوراکل رفیقم! از اونایی ام که تا چیزی رو کامل نفهمم،ول کن نیستم، یادگرفتن برام مثل بازیه، و نوشتن اینجا کمک می کنه تا چیزایی که یاد گرفتم رو با بقیه به شریک بشم، با هم پیشرفت کنیم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *