Oracle kullanıcısının varsayılan şemasını nasıl ayarlayabilirim?


12

Oracle'da birkaç yeni kullanıcı oluşturdum. Ancak, sqlplus'ı çalıştırırken, hepsinin sorgudaki tablo adlarını tam olarak nitelendirmesi gerekir. Bu yeni kullanıcılar için varsayılan bir şema belirlemenin en iyi yolu nedir?

Yanıtlar:


19

set search_pathOracle'da PostgreSQL gibi bir şey yok .

Aklıma gelen kullanıcı için bir oturum açma tetikleyici olacağını düşünüyorum en yakın şey bir 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;
/  

Kullanıcı listesi çok uzun değilse, her kullanıcı için bu tetikleyiciyi oluşturmak zorunda kalmamanız için bir veritabanı oturum açma tetikleyicisi oluşturabilirsiniz:

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;
/  

Elbette, varsayılan şemayı değiştirmek istediğiniz kullanıcıların listesi de tablodan alınabilir. Bu durumda, bu özelliği "etkinleştirmek" için (her seferinde tetikleyiciyi yeniden oluşturmak yerine) yalnızca satır eklemeniz veya silmeniz gerekir.

Başka bir seçenek, her gerçek tabloya işaret eden kullanıcı oluşturduğunuzda eş anlamlılar oluşturmak olacaktır. Bunu, bir şemadaki tüm tablolarda dolaşan ve diğer şemadaki eş anlamlıları oluşturan saklı yordam kullanarak otomatikleştirebilirsiniz.

Tüm Oracle kullanıcılarınız aynı tablolarda çalışmadığı sürece , yalnızca bir kez oluşturmanız gereken genel eşanlamlıları kullanmamanızı şiddetle tavsiye ederim - kurulumunuzda farklı uygulama kullanıcıları varsa çok fazla soruna neden olabilirler.

Düzenle :

Alex'in önerisini takiben, kullanıcı adı yerine rolü kontrol eden bir oturum açma tetikleyicisi:

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;
/

Harika bir fikir, ancak when others then null;bir tümünü yakalama olduğundan, herhangi bir hatayı görünmez kıldığından sorun gidermeyi zorlaştıracaktır. İstisna işlemeyi tamamen kaldırın veya hatayı sunucuda AUTONOMOUS işleminde günlüğe kaydedip yeniden YÜKSELTİNİZ ?
George3

@ George3: ama istisna gerçekten atılırsa, kullanıcı giriş yapamaz - Ben sadece tetikte yanlış aptal bir kişi nedeniyle giriş yapamamak önlemek istedim. Ama herkes bunu istediği gibi uyarlayabilir.
a_horse_with_no_name

0

Bir tane ayarlamanın bir yolu olduğunu düşünmezdim. Kullanıcı şemadır. AFAIK yalnızca varsayılan tablo alanını ayarlayabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.