在表中插入记录之前,如何检查表是否具有特定授予?

时间:2019-04-04 13:13:12

标签: oracle plsql

场景:我有一个配置表,其中包含有关日志表的元数据(例如Table_name,table_owner)。我想向此配置表添加一个触发器,该触发器实质上检查要插入的表记录是否具有特定的授予(删除)权限(如果没有),则不允许这种情况发生。我该怎么办?

1 个答案:

答案 0 :(得分:0)

另一种方法是忽略触发器,但使用VIEW...WITH CHECK OPTION来控制没有人插入不应插入的数据。

假设您的配置表如下:

CREATE TABLE my_config 
  ( owner VARCHAR2(30) NOT NULL,
    table_name VARCHAR2(30) NOT NULL,
    other_stuff VARCHAR2(500),
    CONSTRAINT my_config_pk PRIMARY KEY ( owner, table_name ) );

创建一个视图来处理插入

视图的条件将其限制为仅包括当前用户对其具有DELETE特权的表。

WITH CHECK OPTION将确保没有人可以使用该视图来插入或更新不满足该视图的数据。

CREATE VIEW my_config_ins_v
AS
SELECT * FROM my_config c
WHERE EXISTS ( SELECT 'user has delete privs'
               FROM   user_tab_privs p
               WHERE  p.owner = c.owner
               AND    p.grantee = user
               AND    p.table_name = c.table_name
               AND    p.privilege = 'DELETE' )
WITH CHECK OPTION;

尝试一下

INSERT INTO my_config_ins_v VALUES ('USER_1','TABLE_I_HAVE_ACCESS_TO', 'STUFF');
-- 1 row inserted.

INSERT INTO my_config_ins_v VALUES ('SYS','OBJ$', 'STUFF');
-- ORA-01402: view WITH CHECK OPTION where-clause violation

自然,要使其生效,您就不能

GRANT INSERT ON my_config TO anyone;  -- don't do this

相反:

GRANT INSERT ON my_config_ins_v TO anyone;