আমি ওরাকলে কয়েকটি নতুন ব্যবহারকারী তৈরি করেছি। যাইহোক, বর্গক্ষেত্র চলাকালীন, তাদের সকলকে সারণীর নামগুলি পুরোপুরি যোগ্য করে তোলা উচিত। এই নতুন ব্যবহারকারীদের জন্য একটি ডিফল্ট স্কিমা সেট করার সেরা উপায় কি?
আমি ওরাকলে কয়েকটি নতুন ব্যবহারকারী তৈরি করেছি। যাইহোক, বর্গক্ষেত্র চলাকালীন, তাদের সকলকে সারণীর নামগুলি পুরোপুরি যোগ্য করে তোলা উচিত। এই নতুন ব্যবহারকারীদের জন্য একটি ডিফল্ট স্কিমা সেট করার সেরা উপায় কি?
উত্তর:
set search_path
ওরাকলে পোস্টগ্রিসএসকিউএল এর মতো কিছুই নেই ।
আমি যে নিকটতম জিনিসটি ভাবতে পারি তা ব্যবহারকারীর জন্য লগন ট্রিগার হতে পারে run ALTER SESSION SET CURRENT_SCHEMA ...
CREATE OR REPLACE TRIGGER LOGON_TRG
AFTER LOGON ON SCHEMA
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foobar';
EXCEPTION
when others
then null; -- prevent a login failure due to an exception
END;
/
যদি ব্যবহারকারীদের তালিকা খুব দীর্ঘ না হয় তবে আপনি একটি ডাটাবেস লগন ট্রিগার তৈরি করতে পারেন যাতে আপনাকে প্রতিটি ব্যবহারকারীর জন্য সেই ট্রিগার তৈরি করতে হবে না:
CREATE OR REPLACE TRIGGER LOGON_TRG
AFTER LOGON ON DATABASE
BEGIN
if (user in ('TOM', 'DICK', 'HARRY')) then
EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foobar';
end if;
exception
when others
then null; -- prevent a login failure due to an exception
END logon_trg;
/
অবশ্যই আপনি যেখানে ব্যবহারকারীদের ডিফল্ট স্কিমা পরিবর্তন করতে চান তাদের তালিকাও একটি টেবিল থেকে নেওয়া যেতে পারে। সেক্ষেত্রে আপনাকে এই বৈশিষ্ট্যটি "সক্রিয় করতে" (প্রতিটিবার ট্রিগারটি পুনরায় তৈরি করার পরিবর্তে) কেবল সেখান থেকে সারিগুলি সন্নিবেশ করা বা মুছতে হবে।
আরেকটি বিকল্প হ'ল প্রতিবার ব্যবহারকারী তৈরি করার সময় প্রতিশব্দ তৈরি করবেন যা আসল টেবিলগুলিতে নির্দেশ করবে। আপনি স্বয়ংক্রিয় করতে পারেন যে কোনও সঞ্চিত পদ্ধতি ব্যবহার করে যা একটি স্কিমাতে সমস্ত টেবিলের মধ্য দিয়ে যায় এবং অন্য স্কিমাতে তাদের জন্য প্রতিশব্দ তৈরি করে।
যদি আপনার সমস্ত ওরাকল ব্যবহারকারী একই টেবিলগুলিতে কাজ না করেন তবে আমি আপনাকে সর্বজনীন প্রতিশব্দ ব্যবহারের বিরুদ্ধে দৃ strongly়ভাবে পরামর্শ দেব যা আপনাকে কেবল একবার তৈরি করতে হবে - যদি আপনার ইনস্টলেশনটিতে বিভিন্ন অ্যাপ্লিকেশন ব্যবহারকারী উপস্থিত থাকে তবে তারা প্রচুর সমস্যার কারণ হতে পারে।
সম্পাদনা করুন :
অ্যালেক্সের পরামর্শ অনুসরণ করে, এখানে একটি লগন ট্রিগার রয়েছে যা ব্যবহারকারীর নাম না দিয়ে ভূমিকাটি পরীক্ষা করে:
CREATE OR REPLACE TRIGGER LOGON_TRG
AFTER LOGON ON DATABASE
declare
has_role boolean;
BEGIN
has_role := dbms_session.is_role_enabled('FOOBAR_ROLE');
if (has_role) then
EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foobar';
end if;
exception
when others
then null; -- prevent a login failure due to an exception
END logon_trg;
/
when others then null;
এটি একটি ক্যাচ-অল তাই এটি সমস্যা সমাধানের বিষয়টি জটিল করে তুলবে কারণ এটি কোনও ত্রুটি অদৃশ্য করে তোলে। সম্ভবত পুরোপুরি হ্যান্ডলিং ব্যতিক্রমগুলি সরিয়ে ফেলুন বা কোনও অটোমোনাস লেনদেনে সার্ভারে ত্রুটিটি লগ করুন এবং তারপরে এটি পুনরায় যুক্ত করুন ?