2014-11-16 4 views
3

테이블에 데이터를 삽입하고 싶습니다. 데이터가 삽입되면 사람들은 전체 테이블에서 하나의 열만 업데이트 할 수 있습니다. 나는 이것에 아래에 시도한다 그러나 나는 오류를 얻는다 - ORA-04092 : 방아쇠에서 COMMIT 또는 ROLLBACK 할 수 없다 :ORACLE PL/SQL - GRANT/REVOKE 권한

나의 방아쇠는 여기있다. 내 생각은 사용자가 데이터를 삽입 할 수있는 모든 권한을 부여하는 것이 었습니다. 데이터가 삽입 된 후 하나의 열에 대해서만 UPDATE 권한을 제거하십시오. 이 테이블이 있다고 가정 해 보겠습니다.

CREATE TABLE tabelName(
    col1 INTEGER, 
    col2 INTEGER, 
    col3 INTEGER, 
    col4 INTEGER 
); 


CREATE OR REPLACE TRIGGER TRG_TABLENAME_BI 
BEFORE INSERT 
ON TABLENAME 

BEGIN 
    EXECUTE IMMEDIATE 'GRANT ALL ON TABLENAME TO PUBLIC'; 
END; 
/

CREATE OR REPLACE TRIGGER TRG_TABLENAME_AI 
AFTER INSERT 
ON TABLENAME 

BEGIN 
    EXECUTE IMMEDIATE 'REVOKE UPDATE (col1,col2,col3) TABLENAME to PUBLIC'; 
END; 
/

마지막으로 우리는 테이블에 데이터를 삽입 한 후 tableName의 col4 만 업데이트 할 수 있습니다. 우리가 할 경우

UPDATE tableName 
SET col2= 10 
WHERE col1=1; 

을하지만 난 그것을 알아낼 방법을 잘 모릅니다 :

INSERT INTO tableName VALUES(1,2,3,4); 
1 row created 

난 단지 습관 일 다음이 UPDATE

UPDATE tableName 
SET col4= 10 
WHERE col1=1; 

을 할 수 있습니다. 감사합니다.

+0

'테이블 레벨'에'부여 인서트'를하지만,'컬럼 레벨'에서만'부여 갱신 '을합니다. –

답변

4

트리거에서 grant 또는 revoke 권한을 가질 수 없습니다. INSERTUPDATE(col4)에 사용자에게 권한을 부여하려는 것 같습니다.

CREATE TABLE tableName(
    col1 INTEGER, 
    col2 INTEGER, 
    col3 INTEGER, 
    col4 INTEGER 
); 

GRANT INSERT ON tableName TO public; 

GRANT UPDATE(col4) ON tableName TO public; 

물론 이것은 다른 사용자가 테이블에 부여한 권한에만 영향을 미칩니다. 테이블의 소유자는 항상 테이블의 데이터를 변경할 수있는 권한을가집니다. public에 실제로 권한을 부여하는 것이 아니라 데이터를 수정해야하는 비즈니스 역할과 관련하여 시스템에 정의한 일부 사용자 또는 역할에 권한을 부여한다고 가정합니다.

+0

CHARM처럼 작동합니다! 감사합니다. – Thapipo