2013-02-20 2 views
0

질문이 조금 이상합니다. 그러나 사용자가 주석을 줄 때 테이블의 업데이트 만 허용되는 방식을 찾고 있습니다. 주석은 일반 테이블을 갱신 할 때 두 번째 감사 테이블에 저장되어야합니다.
"update table set ..."을 실행할 때 사용자가 어떻게 주석을 줄 수 있는지는 오라클에 없다고 생각합니다.

그래서 사용자가 매개 변수로 문과 설명을 전달할 수있는 자체 프로 시저를 만듭니다. 이 절차가없는 업데이트는 트리거에 의해 방지됩니다.오라클 : 업데이트 만 허용됨

create or replace 
    PROCEDURE Update_Table(stmt varchar2, comment varchar2) AS 
    BEGIN 
     Insert into audit_table values(stmt, comment); 
     Execute immediate stmt; 
END Update_Table; 

저는이 솔루션에 만족하지 않습니다. 어쩌면 해결책이 훨씬 간단해질 수도 있습니다.

+2

"주석"열을 포함하고 주 테이블에서 업데이트를 수행하는 트리거 대신에 감사 테이블에 주석을 삽입하는보기는 어떻습니까? 그런 다음 테이블에 대한 업데이트 권한을 취소 할 수 있으며 모든 업데이트는 뷰를 통과해야합니다. 그런 방아쇠가 가능한지 모른다. –

+0

그래도 위와 같은 절차가 필요합니까? – Maxii

+0

절차가 없으며 트리거 만 있습니다. –

답변

5

표준 접근 방식은 사용자가 기본 테이블에 대해 UPDATE 문을 발행하지 못하게하는 것입니다. 일반적으로 UPDATE 권한을 취소 한 다음 사용자에게 사용 권한을 부여한 저장 프로 시저 (아마도 해당 테이블에 INSERT과 같은 다른 종류의 DML 작업을 수행하는 절차와 함께 패키지에 있음)를 만듭니다. 그런 다음 사용자는 저장 프로 시저를 호출하여 주석을 전달하고 저장 프로 시저는 실제로 테이블을 업데이트하기 전에 필요한 모든 유효성 검사를 구현합니다.

어떤 이유로 사용자가 명시적인 UPDATE 문을 실행할 수있는 권한을 부여해야하는 경우 UPDATE 문을 실행하기 전에 저장 프로 시저를 호출해야합니까? 그렇다면 주석을위한 패키지 레벨 변수와 주석을 설정하고이 패키지 레벨 변수에서 데이터를 읽는 테이블에 트리거를 작성한 패키지를 작성할 수 있습니다. 그렇지 않은 경우 예외를 발생시킵니다 설정하고 필요한 모든 로깅을 수행합니다.

또 다른 옵션은 실제로 comment 열을 테이블에 추가하여 마지막 수정을위한 주석을 저장 한 다음 주석을 별도의 테이블에 작성하고 테이블의 제약 조건을 강제로 작성하는 것입니다 comment이 설정됩니다.

당신은 @a_horse_with_no_name 알 수 있듯이 또한,의 comment 열을 포함하는 뷰를 작성, 테이블에 대한 액세스 권한을 취소 한 다음 문은 다음 적절한 값에 comment 열을 설정 여부를 확인하는 INSTEAD OF UPDATE 트리거를 작성할 수 기본 테이블에 대해 적절한 DML을 발행합니다.

+0

정말 좋은 것 같습니다. 고맙습니다 – Maxii