
اگر با دیتابیس Oracle کار میکنی، حتماً برایت پیش آمده که بخواهی اطلاعات خاصی مثل نام کاربر، نقشها، IP کلاینت، یا حتی نام ماژول برنامهات را در یک نشست (session) تنظیم کنی. اینجاست که پکیج قدرتمند DBMS_SESSION وارد میشود.
در این مقاله آموزش Oracle در بخش آموزش پکیج های اوراکلی به زبانی ساده و کاربردی یاد میگیری:
- پکیج DBMS_SESSION چی هست؟
- چه توابع و پروسیجرهایی داره؟
- کجاها به دردت میخوره؟
- و چطور با چند خط کد، نشست کاربر رو هوشمندانه مدیریت کنی.
مدیریت فضای ذخیرهسازی در دیتابیس اوراکل همیشه یکی از دغدغههای اصلی مدیران پایگاه داده (DBA) و توسعهدهندگان حرفهای بوده. پیشنهاد می شود نوشته زیر را مطالعه کنید:
در این نوشته شما می خوانید
📌 پکیج DBMS_SESSION چیست؟
DBMS_SESSION یکی از پکیجهای داخلی Oracle است که اجازه میدهد تنظیمات خاصی روی session فعلی اعمال کنیم.
این تنظیمات تا زمانی که کاربر لاگاوت نکرده باقی میمانند و میتونند در گزارشگیری، امنیت، یا مانیتورینگ سیستم به شدت مفید باشند.
✅ کاربردهای اصلی DBMS_SESSION
🔸 ثبت اطلاعات ماژول و عملکرد کاربر
🔸 فعال یا غیرفعال کردن roleها
🔸 تنظیم contextهای امنیتی برای VPD یا FGAC
🔸 تغییر فرمت تاریخ یا زبان برای هر session
🔸 فعالسازی SQL Trace برای debug
🔸 ریست متغیرهای session و حافظه PL/SQL
🧠 توابع و پروسیجرهای پرکاربرد DBMS_SESSION
۱. SET_IDENTIFIER
یک شناسه (مثل آیدی کاربر) برای session تعریف میکنی که بعداً توی گزارشها پیداش کنی.
BEGIN
DBMS_SESSION.SET_IDENTIFIER('user_482');
END;
۲. SET_MODULE
نام ماژول و عملیات جاری رو تنظیم میکنی. این خیلی مهمه چون توی AWR یا V$SESSION قابل ردیابیه.
BEGIN
DBMS_SESSION.SET_MODULE('InventoryApp', 'AddItem');
END;
۳. SET_CLIENT_INFO
اطلاعات دلخواه مثل آیپی کاربر، نسخه اپلیکیشن و … رو توی session ذخیره میکنی.
BEGIN
DBMS_SESSION.SET_CLIENT_INFO('IP: 192.168.1.1 | Mobile');
END;
۴. SET_CONTEXT
برای تعریف context امنیتی خیلی به درد میخوره. مخصوصاً اگه از VPD استفاده میکنی.
BEGIN
DBMS_SESSION.SET_CONTEXT(
namespace => 'MYAPP_CTX',
attribute => 'USER_ROLE',
value => 'ADMIN',
username => NULL,
client_id => NULL
);
END;
۵. SET_ROLE
نقشهای فعال در session رو تنظیم میکنی. حتی میتونی همه roleها رو غیرفعال کنی.
BEGIN
DBMS_SESSION.SET_ROLE('NONE');
END;
۶. IS_ROLE_ENABLED
چک میکنی ببینی یه role خاص فعاله یا نه.
DECLARE
r BOOLEAN;
BEGIN
r := DBMS_SESSION.IS_ROLE_ENABLED('HR_ROLE');
DBMS_OUTPUT.PUT_LINE(CASE WHEN r THEN 'ENABLE' ELSE 'DISABLE' END);
END;
۷. SET_SQL_TRACE
SQL Trace رو روشن یا خاموش میکنی برای بررسی دقیق عملکرد کوئریها.
BEGIN
DBMS_SESSION.SET_SQL_TRACE(TRUE);
END;
۸. SET_NLS
تنظیم فرمتهای محلی مثل تاریخ، زبان و …
BEGIN
DBMS_SESSION.SET_NLS('NLS_DATE_FORMAT', '''YYYY-MM-DD''');
END;
۹. RESET_PACKAGE
متغیرهای حافظه session رو ریست میکنه، انگار session تازه شروع شده.
BEGIN
DBMS_SESSION.RESET_PACKAGE;
END;
۱۰. SET_CLOSE_ON_COMMIT
تعیین میکنی بعد از COMMIT، LOBها (مثل CLOB یا BLOB) بسته بشن یا نه
BEGIN
DBMS_SESSION.SET_CLOSE_ON_COMMIT(TRUE);
END;
💡 یک سناریوی واقعی با DBMS_SESSION
فرض کن یک اپلیکیشن مالی داری که کاربران از وب وارد میشن. میتونی با DBMS_SESSION اطلاعات مربوط به کاربر رو در session ست کنی تا بعداً توی گزارشها یا debug کردن سر دربیاری چه کسی چه کاری کرده:
BEGIN
DBMS_SESSION.SET_IDENTIFIER('user_287');
DBMS_SESSION.SET_MODULE('PaymentGateway', 'PayInvoice');
DBMS_SESSION.SET_CLIENT_INFO('IP=10.10.1.1 | Chrome');
DBMS_SESSION.SET_CONTEXT('PAY_CTX', 'ROLE', 'CUSTOMER', NULL, NULL);
END;
⚠️ نکات مهم امنیتی در مورد DBMS_SESSION
- استفاده از بعضی توابع مثل
SET_CONTEXTنیاز به دسترسی خاص داره. - فقط کاربران با privilege مناسب میتونن از این پکیج استفاده کنن.
- حتماً در اپلیکیشنها contextها رو validate کن تا سوءاستفاده نشه.
سوالات متداول درباره پکیج DBMS_SESSION در Oracle
DBMS_SESSION یک پکیج درونی در Oracle Database است که برای مدیریت نشستهای (sessions) کاربران طراحی شده.
با استفاده از این پکیج میتوان اطلاعاتی مثل نام ماژول، action، شناسه کاربر، نقشها، contextهای امنیتی و حتی فرمت زبان و تاریخ را در طول یک session تنظیم کرد.
این پکیج برای audit، debug، performance tuning و کنترل امنیت دسترسی در برنامههای چندکاربره بسیار کاربردی است.
با استفاده از DBMS_SESSION.SET_MODULE میتوان نام ماژول و عملکرد فعلی کاربر را در session تنظیم کرد.
این اطلاعات بعداً در گزارشهای AWR یا ویوهای V$SESSION و DBA_HIST_ACTIVE_SESS_HISTORY قابل مشاهدهاند و به شناسایی گلوگاههای performance کمک میکنند. مثلاً:
BEGIN
DBMS_SESSION.SET_MODULE(‘OrderAPI’, ‘CreateOrder’);
END;
این خط کد مشخص میکند که این session مربوط به ساخت سفارش در ماژول OrderAPI است.
SET_IDENTIFIERبرای تعیین یک شناسه یکتا جهت audit یا trace در سیستم استفاده میشود (مثلاً آیدی کاربر).SET_CLIENT_INFOبرای درج اطلاعات عمومی کلاینت مثل IP، نوع دستگاه یا نسخه نرمافزار به کار میرود.
هر دو در گزارشگیری و تحلیل دقیقتر session کاربرد دارند، ولی هدف و کاربردشان متفاوت است.
با استفاده از DBMS_SESSION.SET_CONTEXT میتوان contextهای امنیتی خاص برای هر session تعریف کرد.
این contextها میتوانند در policyهای امنیتی مثل VPD (Virtual Private Database) یا FGAC برای محدودسازی دسترسی به دادهها استفاده شوند. مثال:
BEGIN
DBMS_SESSION.SET_CONTEXT(‘SEC_CTX’, ‘USER_ROLE’, ‘MANAGER’);
END;
سپس میتوان از این context در policyها برای فیلتر کردن دادههای قابل مشاهده توسط آن کاربر استفاده کرد.
📦 جمعبندی
پکیج DBMS_SESSION ابزاری قدرتمند برای کنترل نشست کاربران در Oracle Database هست.
با چند خط کد میتونی اطلاعات بسیار مفیدی برای audit، performance tuning، و امنیت سیستم ثبت کنی.
اگر توسعهدهنده PL/SQL هستی یا با سیستمهای multi-user سر و کار داری، یاد گرفتن این پکیج برایت یک ضرورت محسوب میشه.
📥 اگر سوالی داری در مورد پکیج DBMS_SESSION در اوراکل داری، در بخش کامنتها بپرس.
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید