在Oracle数据库中如何使一张表只读

先说下需求,是希望某一张表临时设为只读,后续还会改回可读写。

法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.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值