>场景:我有一个配置表,其中包含有关日志表的元数据(例如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;