先说下需求,是希望某一张表临时设为只读,后续还会改回可读写。
法1:通过赋权
这是最推荐的方法,如果做不到,再考虑余下方法。
GRANT SELECT on <table_name> to <APP_USER>;
如果是Oracle 12cR1版本以上,建议用READ替代SELECT:
GRANT READ on <table_name> to <APP_USER>;
毕竟SELECT还包含SELECT…FOR UPDATE权限。
法2:修改表为READ ONLY
其实特简单:
-- 改为只读
ALTER TABLE table_name READ ONLY;
-- 改为读写
ALTER TABLE table_name READ WRITE;
但这里有个问题,表的属主是无法收回其ALTER TABLE权限的。也就是说,DBA改为了只读,表的属主还可以把他改成读写。
其实数据库数据有个最佳实践,即创建对象的用户(Schema user)和使用对象的用户(Application user)不应该是同一个。
如果不幸是同一个用户,那么还需要启用审计,以监控此用户的:
1)ALTER TABLE操作
2)修改表的操作(成功和不成功的都需要记录)
如何审计,请参考一个简单的Oracle审计实验。
法4:通过触发器
示例代码如下:
CREATE OR REPLACE TRIGGER trg_my_table_readonly
BEFORE INSERT OR UPDATE OR DELETE ON my_table
BEGIN
RAISE_APPLICATION_ERROR(-20001, 'Table is read-only');
END;
/
法3:只读表空间
这个影响的就是表空间上所有表了,比较适合归档数据。
SQL> alter tablespace users read only;
Tablespace altered.
SQL> delete from hr.employees;
delete from hr.employees
*
ERROR at line 1:
ORA-00372: file 12 cannot be modified at this time
ORA-01110: data file 12: '/opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01.dbf'
SQL> alter tablespace users read write;
Tablespace altered.

2174

被折叠的 条评论
为什么被折叠?



