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?
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:
set search_path
Oracle'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;
/
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 ?