数据库管理 2023-04-14
- 第六十七期 SQL Domain 2
- 1 Domain函数
- 示例
- 总结
第六十七期 SQL Domain 2
昨晚割接,搭了一套19c的ADG,今天睡了个懒觉,早上把笔记本内存扩到了64GB,主要是为了后面做实验。然后下午拼了个乐高,根据公司要求报了个1Z0-902,也算是给我的那么多台Exadata维护搞个持证上岗。
到了晚上确实没忍住,总觉得昨天文章对SQL Domain没有很全面,今天继续探索。
1 Domain函数
【https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain-functions.html】
SQL Domain配套新增了一系列函数进行配合使用,昨天最后一个示例也展示了domain_display可以配合Domain限制实现脱敏。
- domain_display::=
- domain_name::=
- domain_order::=
- domain_check::=
- domain_cast::=
其中domain_display、domain_name和domain_order可以跟不止一个参数。
domain_display返回与参数关联的domian的domain display表达式。给定U.D,一个限定domain名称,其中U代schema或用户名,D代表domain名,domian U.D(a1,…,an)与由第i个参数取代的U.D第i列相关联。如果(a1,…,an)与domain不关联,或者如果U.D没有显示表达式,则返回NULL。(不得不说这段话没大看懂,从昨天示例来看就是按照限制对原始内容进行处理后显示出来)
domain_name返回与参数关联的domain的指定domain名称(如果有),否则返回NULL。
domain_order返回与参数关联的domian的顺序表达式。DOMAIN_ORDER(a1,…,an)返回域U.D(a1,…,an)关联的domain顺序表达式,其中U.D第i列被第i个参数替换。如果(a1,…,an)与domain不关联,或者如果U.D没有顺序表达式,则返回NULL。如果当前用户对参数所关联的domain没有EXECUTE权限,则还会返回NULL。(还是云里雾里的,下面看看能不能做实验)
DOMAIN_CHECK要求第一个参数是一个常量字符串,作为domain的名称(可能是指定schema)。如果名称不符合条件,则当前用户应为domian的所有者。DOMAIN_CHECK(‘U.D’,a1,…,an)返回一个错误,如果第一个参数不是计算结果为domain名称的常量字符串,或者如果第一个参数计算结果为“U.D”并且当前用户在U.D上具有EXECUTE权限,但以下其中一项不成立,则用户对domain没有EXECUTE权限:(a)U.D没有n列,或(b)第i个参数数据类型与第i个域列不兼容,其中,“兼容”是指它是相同的数据类型,除了小数位数、精度、长度可以更大之外,或者(c)第i个域列具有与第i个参数排序规则不同的排序规则属性,或者(d)当约束条件中的第i个畴列被第i个自变量替换时,任何U.D的启用约束都不满足。(同上,不重复了|| _ ||)
domain_cast算了,我更看不懂,直接po原文(和机翻)了,感觉实验也不大好做的样子:
CAST(expr AS DOMAIN [U.]D) raises an error if [U].D is not a domain or if the user has no EXECUTE privilege on U.D or if U.D is a multi-column domain. It also raises an error if expr cannot be casted to the domain’s column data type, or if any of the domain’s enabled constraints is not satisfied when the domain column is substituted by expr. The result expression is cast to the domain column’s data type. Not yet in the label but soon to be merged, there is support for CAST(expr AS [U.]D) (where the keyword DOMAIN is not specified). It will behave as CAST (expr AS DOMAIN [U.]D) if [U.]D is a domain, or else it will expect [U.]D to be an ADT.
如果[U].D不是域,或者用户对U.D没有EXECUTE权限,或者U.D是多列域,CAST(expr AS DOMAIN[U.]D)会引发错误。如果无法将expr强制转换为域的列数据类型,或者当域列被expr替换时,不满足域的任何启用约束,也会引发错误。结果表达式被强制转换为域列的数据类型。尚未在标签中,但即将合并,支持CAST(expr AS[U.]D)(其中未指定关键字DOMAIN)。如果[U.]D是一个域,它将表现为CAST(expr as DOMAIN[U.]D),否则它将期望[U.]D.是一个ADT。(by 度娘)
示例
domain_display就不做实验了,详见上一期。
domian没生效?!
有点意思。
domain_check这个函数看起来主要是针对内容进行判断,是否满足domian中的check条件。
还是绕不过display。
domain_order则显示domain中指定的周日期和数字之间的对应,然而,1和4都else成了7,其实不大满足条件。rollback并drop table tm3 purge,看看怎么能实现需求。
给表加一个check约束是可以实现滴,虽然一开始想用boolean和domain_check连用来实现,但是一直在失败。
似乎是domain_order和domain_check脱离了表不能直接使用。
总结
第一次一周写三篇,其实还有一些关于SQL Domain的没涉及,看看下期是不是换个内容。
老规矩,知道写了些啥(有点晕就是了)。