Oracle 사용자의 기본 스키마를 설정하는 방법은 무엇입니까?


12

Oracle에서 몇 명의 새로운 사용자를 만들었습니다. 그러나 sqlplus를 실행할 때는 모두 쿼리에서 테이블 이름을 정규화해야합니다. 이 새로운 사용자에 대한 기본 스키마를 설정하는 가장 좋은 방법은 무엇입니까?

답변:


19

set search_pathOracle 에는 PostgreSQL과 같은 것이 없습니다 .

내가 생각할 수있는 가장 가까운 것은 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;
/  

물론 기본 스키마를 변경하려는 사용자 목록도 테이블에서 가져올 수 있습니다. 이 경우 매번 트리거를 다시 작성하지 않고이 기능을 "활성화"하기 위해 행을 삽입하거나 삭제하기 만하면됩니다.

다른 옵션은 실제 테이블을 가리키는 사용자를 작성할 때마다 동의어를 작성하는 것입니다. 하나의 스키마에서 모든 테이블을 반복하고 다른 스키마에서 동의어를 생성하는 저장 프로 시저를 사용하여이를 자동화 할 수 있습니다.

모든 Oracle 사용자가 동일한 테이블에서 작업 하지 않으면 한 번만 작성해야하는 공용 동의어를 사용하지 말 것을 강력히 권장 합니다. 설치에 다른 애플리케이션 사용자가있는 경우 많은 문제점이 발생할 수 있습니다.

편집 :

Alex의 제안에 따라 사용자 이름이 아닌 역할을 확인하는 로그온 트리거가 있습니다.

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;포괄적이기 때문에 오류가 보이지 않기 때문에 문제 해결이 복잡합니다. 예외 처리를 완전히 제거하거나 AUTONOMOUS 트랜잭션으로 서버의 오류를 기록한 다음 다시 발생시킬 수 있습니까?
George3

@ George3 : 그러나 예외가 실제로 발생하면 사용자는 로그인 할 수 없습니다-방아쇠에 실수로 실수했기 때문에 누군가가 로그인 할 수 없도록 막고 싶었습니다. 그러나 누구나 원하는대로 자유롭게 조정할 수 있습니다.
a_horse_with_no_name

0

하나를 설정하는 방법이 없다고 생각합니다. 사용자는 스키마입니다. AFAIK 기본 테이블 스페이스 만 설정할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.