트리거를 이용해서 삭제 히스토리를 만드려고 하는데요. 0 6 2,017

by McKee [PL/SQL] [2023.03.22 13:10:10]


안녕하세요 삭제 트리거 질문이 있는데요.

create or replace trigger A_TABLE_BACKUP_T2
after delete on A_TABLE
for each row
begin
insert into A_TABLE_BACKUP(

CHK,
WHO,
OLDCOMPANYID)

VALUES(

'D',      <-- 삭제 flag
user,    <-- 삭제한 user
:old.COMPANYID

);

END;

위 형식으로 트리거를 생성을 했는데

user 로 넣으니까 system 명이 들어가더라고요.

저는 누가 삭제했는지 알고 싶은데 이 경우 방법이 있을까요? 

일단 데이터를 삭제하는 방법은 특정 시스템 UI 에서 수행 -> 패키지 -> 프로시져 -> 트리거 이런식으로 흘러갑니다.

 

감사합니다.

by 동동동 [2023.03.22 14:48:25]

트리거로 하실경우    

    SYS_CONTEXT('USERENV', 'SESSION_USER')
    SYS_CONTEXT('USERENV', 'OS_USER')
    SYS_CONTEXT ('USERENV', 'HOST')
    SYS_CONTEXT ('USERENV','MODULE')
    SYS_CONTEXT ('USERENV', 'TERMINAL')
    SYS_CONTEXT('USERENV', 'IP_ADDRESS')

...

등으로 어떤 Client 에서 작업 됬는지는 알수 있습니다.

 

UI단에서 수정자를 받고 있고 A_TABLE에 수정자 컬럼이 존재한다면 삭제전 A_TABLE의 수정자를 Update하고 삭제전 트리거에서 A_TABLE의 수정자를 삭제자로 하면 되지 않을까 생각이 드네요..

 


by McKee [2023.03.22 16:04:13]

감사합니다. 마지막으로 설명해주신 방법으로 한번 해봐야겠네요. SYS_CONTEXT 는 다 운영서버에서 했다고 나오더라고요.


by 마농 [2023.03.22 16:01:21]

트리거 보다는 프로시져 삭제 로직 안에 포함시켜야 할 것 같습니다.


by McKee [2023.03.22 16:05:29]

위의 방법이 안되면 이렇게라도 해봐야겠네요. 답변 감사드립니다.


by 마농 [2023.03.22 16:13:15]

안되면 차선으로 선택한다기 보다는
저는 이게 더 나은 방법이라고 생각합니다.


by McKee [2023.03.22 16:18:35]

네 안그래도 해보니 트리거 안에는 대상 TABLE을 사용할 수가 없네요. 말씀하신대로 해야 겠네요. 감사합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입