به عنوان DBA (با کاربر SYS در PDB1)، میخواهیم یک دیتابیس لینک خصوصی به نام link_to_pdb2 را در اسکیمای کاربر vahid ایجاد کنیم و سپس آن را حذف کنیم. تمام این عملیات بدون دانستن پسورد کاربر vahid انجام خواهد شد.
پیشنیازها:
- کاربران vahid (در PDB1) و mehrzad (در PDB2) با دسترسیهای لازم ایجاد شدهاند.
- کاربر vahid دسترسی CREATE DATABASE LINK را دارد.
- فایل tnsnames.ora روی سرور به درستی برای PDB2 پیکربندی شده است.
بخش اول: ایجاد دیتابیس لینک خصوصی برای کاربر vahid (توسط DBA)
چالش:
یک DBA نمیتواند مستقیماً با دستوری مانند CREATE DATABASE LINK vahid.link... یک لینک خصوصی برای کاربر دیگر ایجاد کند. این دستور فقط برای ایجاد لینک در اسکیمای فعلی یا به صورت PUBLIC طراحی شده است.
راهحل: استفاده از پروسیجر موقت
ما از دسترسی CREATE ANY PROCEDURE که کاربر SYS دارد استفاده میکنیم تا یک پروسیجر در اسکیمای vahid بسازیم. این پروسیجر، با اختیارات vahid اجرا شده و لینک را برای او ایجاد میکند.
گام 1: ایجاد پروسیجر موقت برای ساخت لینک (توسط SYS)
با کاربر SYS به PDB1 متصل شوید و دستور زیر را اجرا کنید:
CREATE OR REPLACE PROCEDURE vahid.create_my_dblink AS
BEGIN
EXECUTE IMMEDIATE 'CREATE DATABASE LINK link_to_pdb2
CONNECT TO mehrzad IDENTIFIED BY mehrzad
USING ''PDB2_ALIAS''';
END;
/
- نکته مهم: توجه کنید که کل دستور
CREATE DATABASE LINKداخل یک رشته ('...') قرار گرفته است. چون خود رشته حاوی علامت نقل قول (برایPDB2_ALIAS) است، باید آن را با دو علامت نقل قول ('') escape کنیم.
گام 2: اجرای پروسیجر (توسط SYS)
حالا پروسیجری را که در اسکیمای vahid ساختیم، اجرا میکنیم:
EXEC vahid.create_my_dblink;
این دستور با موفقیت اجرا میشود، زیرا کد داخل پروسیجر با دسترسیهای مالک آن (vahid) که شامل CREATE DATABASE LINK است، اجرا میشود.
گام 3: حذف پروسیجر موقت (توسط SYS)
برای حفظ پاکیزگی محیط، پروسیجر کمکی را حذف میکنیم:
DROP PROCEDURE vahid.create_my_dblink;
گام 4: تایید ایجاد لینک (توسط SYS)
برای اطمینان از اینکه لینک به درستی در اسکیمای vahid ایجاد شده است، کوئری زیر را اجرا میکنیم:
SELECT owner, db_link, created FROM dba_db_links WHERE owner = 'VAHID';
خروجی باید لینک LINK_TO_PDB2 را با مالکیت VAHID نشان دهد.
بخش دوم: حذف دیتابیس لینک خصوصی کاربر vahid (توسط DBA)
حالا سناریوی اصلی شما را اجرا میکنیم. فرض کنید مدتی گذشته و حالا نیاز است این لینک را حذف کنیم.
چالش:
همانطور که قبلاً دیدیم، اجرای مستقیم دستور DROP DATABASE LINK vahid.link_to_pdb2; توسط SYS با خطای ORA-02024: database link not found مواجه میشود.
راهحل: استفاده مجدد از تکنیک پروسیجر موقت
از همان روش برای حذف استفاده میکنیم.
گام 1: ایجاد پروسیجر موقت برای حذف لینک (توسط SYS)
CREATE OR REPLACE PROCEDURE vahid.drop_my_dblink AS
BEGIN
EXECUTE IMMEDIATE 'DROP DATABASE LINK link_to_pdb2';
END;
/
گام 2: اجرای پروسیجر (توسط SYS)
EXEC vahid.drop_my_dblink;
پروسیجر با دسترسیهای vahid اجرا شده و لینک خصوصی خودش را با موفقیت حذف میکند.
گام 3: حذف پروسیجر موقت (توسط SYS)
DROP PROCEDURE vahid.drop_my_dblink;
گام 4: تایید حذف لینک (توسط SYS)
برای اطمینان نهایی، دوباره کوئری زیر را اجرا میکنیم:
SELECT owner, db_link FROM dba_db_links WHERE owner = 'VAHID' AND db_link = 'LINK_TO_PDB2';
این بار خروجی باید no rows selected باشد که نشاندهنده حذف موفقیتآمیز لینک است.
اکنون شما تمام مراحل لازم برای ایجاد و حذف یک دیتابیس لینک خصوصی برای یک کاربر دیگر را بدون نیاز به پسورد او در اختیار دارید.