কীভাবে একটি ওরাকল ব্যবহারকারীর ডিফল্ট স্কিমা সেট করবেন?


12

আমি ওরাকলে কয়েকটি নতুন ব্যবহারকারী তৈরি করেছি। যাইহোক, বর্গক্ষেত্র চলাকালীন, তাদের সকলকে সারণীর নামগুলি পুরোপুরি যোগ্য করে তোলা উচিত। এই নতুন ব্যবহারকারীদের জন্য একটি ডিফল্ট স্কিমা সেট করার সেরা উপায় কি?

উত্তর:


19

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;এটি একটি ক্যাচ-অল তাই এটি সমস্যা সমাধানের বিষয়টি জটিল করে তুলবে কারণ এটি কোনও ত্রুটি অদৃশ্য করে তোলে। সম্ভবত পুরোপুরি হ্যান্ডলিং ব্যতিক্রমগুলি সরিয়ে ফেলুন বা কোনও অটোমোনাস লেনদেনে সার্ভারে ত্রুটিটি লগ করুন এবং তারপরে এটি পুনরায় যুক্ত করুন ?
জর্জ 3

@ জর্জ 3: তবে ব্যতিক্রমটি যদি আসলে ছুঁড়ে দেওয়া হয় তবে ব্যবহারকারী লগ ইন করতে পারবেন না - আমি কেবল ট্রিগারটিতে ভুল হওয়া একজন বোকামির কারণে কাউকে লগ ইন করতে না পেরে কেবল আটকাতে চেয়েছিলাম। তবে যে কেউ তার / সে যেভাবে চায় তার সাথে এটি মানিয়ে নিতে স্বাধীন।
a_horse_with_no_name

0

আমি ভাবতে পারি যে সেট করার কোনও উপায় আছে। ব্যবহারকারী হ'ল স্কিমা। আফাইক আপনি কেবল ডিফল্ট টেবিল স্পেস সেট করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.