Oracle에서 몇 명의 새로운 사용자를 만들었습니다. 그러나 sqlplus를 실행할 때는 모두 쿼리에서 테이블 이름을 정규화해야합니다. 이 새로운 사용자에 대한 기본 스키마를 설정하는 가장 좋은 방법은 무엇입니까?
Oracle에서 몇 명의 새로운 사용자를 만들었습니다. 그러나 sqlplus를 실행할 때는 모두 쿼리에서 테이블 이름을 정규화해야합니다. 이 새로운 사용자에 대한 기본 스키마를 설정하는 가장 좋은 방법은 무엇입니까?
답변:
set search_path
Oracle 에는 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 트랜잭션으로 서버의 오류를 기록한 다음 다시 발생시킬 수 있습니까?