前言

随着数据库应用场景的多样化,用户对数据管理的灵活性和隐私性提出了更高要求。IvorySQL 作为一款基于 PostgreSQL 并兼容 Oracle 的开源数据库,始终致力于在功能上保持领先和创新。在最新发布的 4.0 版本中,IvorySQL 新增了 Oracle 兼容特性 Invisible Column(不可见列),这一功能由社区贡献者 Imran Zaheer 提供,体现了开源社区协作的力量

Invisible Column 的引入,为开发者提供了在不影响现有应用的情况下动态调整数据库结构的新选择,进一步提升了 IvorySQL 在数据灵活性管理上的能力,为用户在数据库升级、兼容性优化等方面提供了更大的便利性。

本文将详细介绍这一特性的功能、使用场景以及使用方式。

什么是 Invisible Column?

在现代数据库开发中,列的可见性管理在一定程度上影响了应用程序的灵活性与迁移效率。Oracle 12c 提供了一项强大的功能:Invisible Column(不可见列)。这是一种隐藏数据列的特性,用于增强数据安全性和实现业务逻辑。这一功能为开发者提供了灵活性和控制能力,特别是在应用程序迁移或版本升级的场景中。

在 Oracle 中,Invisible Column 是指那些对大多数 SQL 查询和工具不可见的列。通过将列设置为不可见列:

  • 它不会出现在常规的 SELECT * FROM 查询结果中。
  • 它不会在 SQL*PlusOCI 的描述操作中显示。
  • 它不会包含在基于 %ROWTYPE 属性的记录定义中。

然而,不可见列仍然存在于表中,可以通过显式指定列名来访问或引用。另外,不可见列在使用时也有限制,要注意在外部表(External Tables)、聚簇表(Cluster Tables)、临时表(Temporary Tables)中无法使用不可见列。

Invisible Column 的应用场景

1. 应用程序迁移

不可见列在应用程序迁移过程中非常有用。当我们向现有表中添加新列时,不可见列可以避免影响旧应用程序的功能。旧的应用程序不会察觉新列的存在,而新的应用程序可以显式引用这些列。从而使应用程序的在线迁移变得更加简单顺畅。

2. 敏感数据保护

某些敏感数据可以通过不可见列存储,避免被大多数默认查询工具访问,从而降低意外暴露的风险。

3. 数据模型优化

在数据模型调整或调试过程中,可以临时将一些列设置为不可见列,确保它们不会影响常规查询,避免查询结果混淆。

在 IvorySQL 中使用 Invisible Column

Invisible Column 为 IvorySQL 4.0 版本中新增加的兼容特性,使用前请先确保您的版本为 4.0。

1. 创建不可见列

可以在创建表时直接将列定义为不可见列:

CREATE TABLE employees (
emp_id NUMBER,
emp_name VARCHAR2(50),
emp_salary NUMBER INVISIBLE
);

在此示例中,emp_salary 是不可见列,对默认查询不可见:

select*from employees ;
emp_id | emp_name
--------+----------
(0 rows)

2. 向不可见列插入数据

在向表中插入数据时,可以通过显式指定列名的方式向不可见列插入数据:

INSERT INTO employees(emp_id,emp_name,emp_salary) VALUES(1,'Jack',20000);
INSERT 0 1
INSERT INTO employees(emp_id,emp_name,emp_salary) VALUES(2,'Lucy',30000);
INSERT 0 1;

不带命名列的插入不能包含不可见列:

INSERT INTO employees VALUES(3,'Peter');
INSERT 0 1

3. 显示/修改现有列为不可见列

通过 VISIBLE 关键字,可以将不可见列改回普通列:

ALTER TABLE employees MODIFY emp_salary VISIBLE;
ALTER TABLE

如果需要将现有列设置为不可见列,可以使用 INVISIBLE

ALTER TABLE employees MODIFY emp_salary INVISIBLE;
ALTER TABLE

注意,不能将所有的列设置为不可见列。

4. psql \d 元命令

在 psql 中使用 \d 元命令时不会显示该表的不可见列信息:

\d employees
Table "public.employees"
Column | Type | Collation | Nullable | Default
------------+--------------+-----------+----------+---------
emp_id | number | | |
emp_name | varchar2(50) | | |
emp_salary | number | | |

可以使用含有更多表信息的 \d+ 元命令查看该表的不可见列信息:

\d+ employees
Table "public.employees"
Column | Type | Collation | Nullable | Default | Invisible | Storage | Compression | Stats target | Description
------------+--------------+-----------+----------+---------+-----------+----------+-------------+--------------+-------------
emp_id | number | | | | | main | | |
emp_name | varchar2(50) | | | | | extended | | |
emp_salary | number | | | | invisible | main | | |
Access method: heap

5. 访问 Invisible Column

在使用 SELECT* 查询表数据时,不会显示不可见列的数据:

SELECT * FROM employees ;
emp_id | emp_name
--------+----------
1 | Jack
2 | Lucy
3 | Peter
(3 rows)

虽然不可见列对默认查询不可见,但开发者仍然可以通过显式指定列名来访问它:

SELECT emp_name,emp_salary FROM employees ;
emp_name | emp_salary
----------+------------
Jack | 20000
Lucy | 30000
Peter |
(3 rows)

结语

不可见列功能是一项设计精妙的特性,为数据库开发和管理提供了更高的灵活性和安全性。通过合理利用不可见列,开发者可以轻松应对复杂的应用迁移场景,同时保持系统的稳定性和可扩展性。

如果您有正在使用 IvorySQL 数据库的项目,不妨尝试将此功能集成到您的解决方案中,提升整体效率和可靠性。

IvorySQL 4.0 之 Invisible Column 功能解析的更多相关文章

  1. 微信小程序0.11.122100版本新功能解析

    微信小程序0.11.122100版本新功能解析   新版本就不再吐槽了,整的自己跟个愤青似的.人老了,喷不动了,把机会留给年轻人吧.下午随着新版本开放,微信居然破天荒的开放了开发者论坛.我很是担心官方 ...

  2. MySQL 8.0有什么新功能

    https://mysqlserverteam.com/whats-new-in-mysql-8-0-generally-available/ 我们自豪地宣布MySQL 8.0的一般可用性. 现在下载 ...

  3. GoldenGate 12.2 支持不可见列invisible column的复制

    Oracle Goldengate 12.2现在可以复制不可见列,在以前的版本中是没有此项功能的.示例:在源和目标都创建一个不可见和虚拟列commission SQL>  create tabl ...

  4. Unity5 新功能解析--物理渲染与standard shader

    Unity5 新功能解析--物理渲染与standard shader http://blog.csdn.net/leonwei/article/details/48395061 物理渲染是UNITY5 ...

  5. 【原创】Matlab中plot函数全功能解析

    [原创]Matlab中plot函数全功能解析 该帖由Matlab技术论(http://www.matlabsky.com)坛原创,更多精彩内容参见http://www.matlabsky.com 功能 ...

  6. Matlab中plot函数全功能解析

    Matlab中plot函数全功能解析 功能 二维曲线绘图 语法 plot(Y)plot(X1,Y1,...)plot(X1,Y1,LineSpec,...)plot(...,'PropertyName ...

  7. [国嵌攻略][047][MMU功能解析]

    MMU功能解析 1.Memory Management Unit(存储器管理单元) 2.两个进程读取同一个地址能读到不同的值.因为进程访问的是虚拟地址,通过MMU转换成不同的物理地址.不同的进程通过M ...

  8. SpringBoot2.0小程序支付功能实现weixin-java-pay

    SpringBoot2.0小程序支付功能实现weixin-java-pay WxJava - 微信开发 Java SDK(开发工具包); 支持包括微信支付.开放平台.公众号.企业微信/企业号.小程序等 ...

  9. Lemon OA第2篇:功能解析方法

    Lemon OA,整个系统功能也算是比较丰富,OA的很多功能都能看见影子,虽然做得不是很强大 接触Lemon OA,起源于Activiti的学习热情,既然这样,研究Lemon OA的目标有3: 1.L ...

  10. HTML5新表单新功能解析

    HTML5新增了很多属性功能.但是有兼容性问题,因为这些表单功能新增的.我这里做了一个简单的练习,方便参考.如果完全兼容的话,那我们写表单的时候就省了很多代码以及各种判断. <!DOCTYPE ...

随机推荐

  1. Qt通用方法及类库3

    函数名 //设置全局样式 static void setStyle(QUIWidget::Style style); static void setStyle(const QString &q ...

  2. Datawhale冬令营第二期!Task2🌼

    Datawhale冬令营第二期-Task2:学AI编程的Prompt工程,提升效果 对应链接:https://www.datawhale.cn/activity/116/23/95?rankingPa ...

  3. 即时通讯技术文集(第22期):IM安全相关文章(Part1) [共13篇]

    ​为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第22 期. [- 1 -] 即时通讯安全篇(一):正确地理解和使用Android端加密算法 ...

  4. 如何像专家一样高效使用 Google 搜索

    如何像专家一样高效使用 Google 搜索 你几乎可以在互联网上搜索到任何内容,而Google是大多数人选择搜索信息的主要途径之一. 尽管频繁地使用Google,但是大部分互联网用户都不知道如何快速和 ...

  5. 解决mapper重名问题

    问题 公司有一个集成开发平台,导入数据库表会自动生成实体类.mapper和xml等文件,这是一件很方便的事,可以省去很多没有技术性的重复工作. 但是最近我在使用这个平台的时候遇到了一个问题,那就是ma ...

  6. VUE3基础环境搭建

    VUE3基础环境搭建 1. 安装vue.js npm install vue -g 安装webpack Webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bun ...

  7. [LC793]阶乘函数后 K 个零

    题目描述 f(x) 是 x! 末尾是 0 的数量.(回想一下 x! = 1 * 2 * 3 * ... * x,且 0! = 1 ) 例如, f(3) = 0 ,因为 3! = 6 的末尾没有 0 : ...

  8. Linux开机LOGO更换以及附带问题

    应用层更换Linux机器开机启动LOGO 平台开机Logo默认是编译进内核的,更换起来很不方便,通过改写内核源码,可以实现应用层直接更换内核Logo. 1.uboot相关修改 网上教程一般会这么改 & ...

  9. Practical Secure Aggregation for Privacy-Preserving Machine Learning

    1 介绍 本文是谷歌团队发在CCS2017上的文章,旨在解决联邦学习中安全聚合的问题. 安全聚合:多方参与者将信息传递给聚合者,聚合者除了知道这个信息的总和不能知道任何一个特定参与者的信息. 在这篇文 ...

  10. Pipe pg walkthrough Intermediate

    NAMP ┌──(root?kali)-[~] └─# nmap -p- -A 192.168.128.45 Starting Nmap 7.95 ( https://nmap.org ) at 20 ...