2013-08-03 4 views
1

일부 값을 저장하기 위해 생성, 변경 및 삭제 된 데이터에서 트리거되는 트리거를 사용하여 감사 로그를 구현하고 싶습니다. 이러한 트리거는 변경을 수행하고 웹 응용 프로그램에서 관리하는 사용자 ID를 사용할 수 있어야합니다. 이 데이터를 제공하는 데 몇 가지 아이디어가 있지만 트리거의 실행 컨텍스트가 무엇인지 완전히 이해하지 못하는 것 같습니다. 나는 PostgreSQL 문서 Overview of Trigger Behavior과 다른 사람을 통해 읽었지만 내 질문에 대답하지 않는 것 같습니다.PostgreSQL에서 데이터베이스 트리거 실행 컨텍스트

내가 알고 싶은 것은 하나의 실행중인 트랜잭션이있는 클라이언트 세션과 트리거 실행 및 둘 다의 수명 및 이들이 서로 의존하는 방식입니다. 내 이해에서 트리거는 트리거 실행으로 이어지는 이벤트를 작성한 클라이언트 세션과 독립적으로 데이터베이스 내에서 실행됩니다. 그 맞습니까? 이는 트리거를 의미하며 처리는 클라이언트 요청의 성능에 영향을 미치지 않으며 클라이언트는 언제든지 세션을 닫을 수 있습니다. 둘 다 독립적 인 경우 클라이언트가 트랜잭션을 롤백하는 경우 트리거가 어떻게 통보됩니까? 논리적으로 데이터가 전혀 변경되지 않았다는 것을 의미합니까? 또는 트랜잭션이 독립적으로 실행되기 때문에 트랜잭션을 커밋 한 후에 트리거가 실행됩니까?

트리거가 실행되는 이벤트를 만든 클라이언트 세션에서 트리거가 비동기로 실행 되었습니까? 이것은 클라이언트가 어떤 이유로 든 세션을 닫으면 트리거가 중단된다는 것을 의미합니다. 변경 사항은 클라이언트 트랜잭션에 직접 바인딩되므로 롤백 할 수도 있습니다.

another question에서 내가 뭘하고 싶은지 알고 행동을 이해해야합니다.

입력 해 주셔서 감사합니다. 나의 이해 트리거에서

+1

기존 감사 트리거 구현을 살펴 보셨습니까? https://wiki.postgresql.org/wiki/Audit_trigger_91plus 및 https://github.com/2ndQuadrant/audit-trigger – bma

+1

아니요, 트리거는 독립적이고 비동기 적이 지 않습니다. 트리거는 트랜잭션의 고유 한 부분이므로 사용자 세션에서 실행됩니다.작업이 끝난 후 (그러나 커밋 전) 롤백이 발생하면 트랜잭션과 trigerr에 의해 수행 된 모든 변경 사항이 롤백됩니다. – krokodilko

+0

@bma : 아니, 링크를 가져 주셔서 감사하지 않았다. 나는 8.4에 머물렀으므로 새로운 것을 사용할 수는 없지만 이전 구현을 살펴볼 것이다. –

답변

1

는 리드 실행을 트리거 할 수있는 이벤트를 만든 클라이언트 세션에서 독립적으로 데이터베이스 내에서 실행됩니다. 그 맞습니까? 즉 트리거 을 의미하고 그 처리는 클라이언트 요청 의 성능에 영향을주지 것이며, 클라이언트가 언제든지

아니 그들이 완전히 트랜잭션의 일부로서, 클라이언트 세션에 의존에서 세션을 종료 할 수있는 자체 세션에 연결되어 있습니다. CREATE TRIGGER에서이 발췌 (9.1)를 참조하십시오 :

그들은 가 이벤트를 트리거하거나 포함하는 트랜잭션의 끝에서 원인이되는 문장의 끝에서 중 발사 할 수있다; 후자의 경우에 그들은 당신이 트리거를 연기하지 않는 8.4을 사용하고 표시하여 other question에서 연기

이라고, 그래서 심지어는 간단합니다. 트리거는 항상 명령문의 끝 (트리거 이벤트)에서 실행됩니다. 이는 실행 확인이 서버에 의해 클라이언트에 전송되기 전에 발생한다는 것을 의미합니다.

바로 뒤에 오는 COMMIT는 새 명령이며 트리거가 완료되기 전에 실행할 수 없습니다.

+0

고맙습니다. 간단하고 간단합니다. :-) 이것은 트리거가 트랜잭션 내에서 수행하는 모든 것에 대한 완전한 액세스 권한을 가지고 있음을 의미합니다. 특히 트리거를 실행시키는 명령문과 관련이없는 데이터가있는 임시 테이블을 생성 했습니까? 내 말은 임시 테이블을 만들고, 일부 데이터를 삽입하고, 실행을 트리거하는 문을 실행하고, 트리거는 이전에 삽입 된 데이터에 액세스 할 수 있다는 것입니다. –

관련 문제