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



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

另一种方法是忘记触发器,但使用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;

相关内容

  • 没有找到相关文章

最新更新