禁止Oracle里的虚拟列(oracle不允许虚拟列)
禁止Oracle里的虚拟列
在Oracle数据库中,虚拟列是一种通过SQL查询语句生成的列。虚拟列不实际存在于表中,而是根据查询语句的结果自动生成。虚拟列的一大优势是可以增强数据的可读性和可理解性。但虚拟列也可能会导致系统性能下降,因此有时候需要禁止使用虚拟列。
禁止Oracle里的虚拟列并不难。可以通过两种方法实现:
1.使用系统参数
Oracle数据库提供了一个名为“_disable_fictitious_cols”的系统参数,该参数可以禁止虚拟列。需要注意的是,修改系统参数可能会影响到整个系统的性能和稳定性,因此在操作前需要谨慎评估。
步骤如下:
(1)以管理员身份登录Oracle数据库。
(2)使用ALTER SYSTEM命令修改系统参数,将“_disable_fictitious_cols”设置为TRUE:
ALTER SYSTEM SET “_disable_fictitious_cols”=TRUE;
(3)重启数据库,使参数生效。
2.使用策略
除了使用系统参数,还可以使用策略来禁止虚拟列。策略是Oracle数据库的一种安全性设置,可以限制用户的权限和行为,从而增加数据的安全性和完整性。
步骤如下:
(1)创建策略,限制用户使用虚拟列:
BEGIN
DBMS_RLS.ADD_POLICY (
object_schema => ‘SCHEMA_NAME’,
object_name => ‘TABLE_NAME’,
policy_name => ‘NO_VIRTUAL_COLUMNS’,
function_schema => ‘SCHEMA_NAME’,
policy_function => ‘NO_VIRT_COLS_FN’,
statement_types => ‘SELECT’,
update_check => FALSE,
enable => TRUE);
END;
/
(2)编写策略函数:
CREATE OR REPLACE FUNCTION NO_VIRT_COLS_FN (
schema_name VARCHAR2,
table_name VARCHAR2,
stmt VARCHAR2)
RETURN VARCHAR2 IS
BEGIN
IF instr(stmt, ‘VIRTUAL_COLUMN_NAME’) 0
THEN
RETURN ‘1=2’;
ELSE
RETURN ‘1=1’;
END IF;
END;
/
(3)验证策略的效果,执行SELECT语句:
SELECT *
FROM TABLE_NAME;
如果查询结果不包含虚拟列,则策略生效。
总结
禁止Oracle数据库里的虚拟列并不是一件难事。使用系统参数或者策略都可以实现。需要注意的是,虚拟列虽然可以提高可读性和可理解性,但如果使用不当,也可能会导致性能下降。因此,需结合具体情况来决定是否禁止虚拟列。