【问题标题】:ORACLE PL/SQL - GRANT/REVOKE PrivilegeORACLE PL/SQL - 授予/撤销权限
【发布时间】:2015-01-13 07:06:06
【问题描述】:

我希望能够在我的表中插入数据。一旦插入数据,人们只能更新整个表中的一列。我尝试在下面执行此操作,但出现错误 - ORA-04092: cannot COMMIT or ROLLBACK in a trigger:

这是我的触发器。我的想法是赋予用户插入数据的所有权限。插入数据后,只删除一列的 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;

但我不知道如何弄清楚。 谢谢。

【问题讨论】:

  • Grant inserttable level 上,但grant update 仅在column level 上。

标签: oracle plsql privileges grant


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    相关资源
    最近更新 更多