현재 세션에서 Oracle 트리거를 사용하지 않도록 설정할 수 있습니까?
테이블에 데이터를 삽입하기 전에 테이블에서 특정 트리거를 사용하지 않도록 설정하지만 동일한 테이블의 데이터를 변경할 수 있는 다른 사용자에게는 영향을 주지 않습니다.문서화된 방법을 찾을 수가 없습니다.이것은 Oracle 11g입니다.
제가 생각해 낼 수 있는 가장 좋은 해결책은 세션 변수를 만들고 애플리케이션이 작업을 수행하기 전에 트리거가 확인하는 값으로 설정하도록 하는 것입니다.
트리거 방지 설명 의무:난 방아쇠가 싫어요.
기존 패키지 사양에 변수를 추가하거나 새 패키지를 만듭니다.
enable_trigger boolean := true;
트리거에서 코드를 다음으로 둘러싸십시오.
enable_trigger인 경우 종료 조건:
트리거를 "비활성화"하려면 변수를 false로 설정합니다.
모범 사례는 변수를 본문에 넣고 설정된 절차와 get 함수를 작성하는 것입니다.
특정 세션에 대해 트리거를 비활성화하는 것은 오라클이나 다른 rdbms에서 가능하다고 생각하지 않습니다.
제 해결책은 로그인하는 CURRENT_USER 또는 session_id를 알고 있다면 트리거에 조건을 넣을 수 있다는 것입니다.
IF SYS_CONTEXT ('USERENV', 'CURRENT_USER') <> '<XYZ>' THEN
--do the operation
END IF;
트리거에 넣어야 하는 이 조건
Oracle Edition이 이러한 목적에 유용할 수도 있습니다.다른 버전에서 다른 트리거를 만들고 해당 버전을 사용하도록 세션을 변경합니다.
http://www.oracle-base.com/articles/11g/edition-based-redefinition-11gr2.php#editions
저는 판본에 대한 실질적인 경험이 없음을 고백해야 합니다.
dbms_application_info를 사용합니다.set_client_info(오라클 설명서에 대한 링크)를 사용하여 프로시저에서 set_client_info를 설정하고 트리거에서 읽습니다.
간단한 예:
SET SERVEROUTPUT ON
declare
CI_Status VARCHAR2(25 BYTE):='';
begin
--set the value
dbms_application_info.set_client_info('qwerty');
-- the value is sent an out to CI_Status when you want to read it
DBMS_APPLICATION_INFO.READ_CLIENT_INFO (CI_Status);
--Output the value in the console
dbms_output.put_line('Value of CI_Status is: ' || CI_Status);
end;
절차에서:
procedure spname is
begin
dbms_application_info.set_client_info('qwerty');
--Do your update
UPDATE tableName set a=b;
--in case you still have the sesion opened, set it to null after
dbms_application_info.set_client_info(null);
end;
트리거 대상:
create or replace TRIGGER Triggername
BEFORE INSERT OR UPDATE
ON tablename
FOR EACH ROW
declare
CI_Status VARCHAR2(25 BYTE):='';
begin
--Retrieve the value into CI_Status the variable
DBMS_APPLICATION_INFO.READ_CLIENT_INFO(CI_Status);
IF INSERTING THEN
null;
ELSIF UPDATING THEN
IF CI_Status = 'qwerty' then
--Do nothing since you dont want the trigger to fire
null;
ELSIF CI_Status is null then
:new.tablefield:= SYSDATE;
END IF;
END IF;
end Triggername;
동시에 사용할 수 없도록 설정하려면
procedure spname is
begin
EXECUTE IMMEDIATE 'ALTER TRIGGER Triggername DISABLE';
UPDATE tableName set a=b;
EXECUTE IMMEDIATE 'ALTER TRIGGER Triggername ENABLE';
end;
언급URL : https://stackoverflow.com/questions/15659188/can-an-oracle-trigger-be-disabled-for-the-current-session
'programing' 카테고리의 다른 글
JavaScript null 검사입니다. (0) | 2023.07.26 |
---|---|
트랜잭션 주석 오류 (0) | 2023.07.21 |
관계형 데이터베이스에서 성능 문제를 어떻게 설명합니까? (0) | 2023.07.21 |
레이블로 선택한 판다는 때때로 Series를 반환하고 DataFrame을 반환합니다. (0) | 2023.07.21 |
열을 결합하여 고유 키를 생성하는지 여부를 확인하는 쿼리 (0) | 2023.07.21 |