ORACLE PL / SQL - GRANT / REVOKE权限

时间:2014-11-16 06:43:13

标签: oracle plsql privileges grant

我希望能够在我的表格中插入数据。插入数据后,人们只能在整个表中更新一列。我尝试下面的这个,但我得到错误 - ORA-04092:不能在触发器中COMMIT或ROLLBACK:

这是我的触发器。我的想法是给予用户插入数据的所有权限。插入数据后,仅删除一列上的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。如果我们这样做:

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

我只能做

UPDATE tableName
SET col4= 10
WHERE col1=1;

下面的更新不会起作用:

UPDATE tableName
SET col2= 10
WHERE col1=1;

但我不知道如何解决这个问题。 谢谢。

1 个答案:

答案 0 :(得分:4)

您无法在触发器中grantrevoke权限。您似乎只想授予用户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权限,而是授予您在系统中定义的与需要修改数据的业务角色相关的某些用户或角色。