上一篇介绍了lightdb/postgresql public、pg_catalog schema的区别及pg_namespace概念,因为最近几个版本开发下来,遇到了很多兼容性挑战。所以这一节来专门讨论一下search_path,以及它是如何实现版本隔离和理论上可实现的租户隔离(实际上,lightdb在22.1-22.2实现了,但是不够放心22.3临时取消了,22.4大概率会加回来,因为这涉及到database级别immutable,所以比较复杂)。
search_path的用途是在语义分析的时候,确定函数、操作符、表等对象时让哪个命名空间中的生效。在Lightdb中,默认情况下,其取值为 "$user", public, lt_catalog。oracle模式,一般建议用户设置为"$user", public, lt_catalog, oracle。mysql模式则设置为"$user", public, lt_catalog, mysql。如果用户要添加一些额外的mysql/oracle兼容函数,可以考虑创建一个新的namepace,如$user_mysql_ext,然后在其中创建兼容函数,并添加到search_path的最后。这样当lightdb新版实现了兼容函数时,因为它会被添加到lt_catalog/mysql/oracle至少之一下,内置版本既能覆盖自定义版本,也不会带来额外的兼容性问题。可以从机制上很好的解决该兼容问题。
虽然search_path能够解决该问题,但是由于它太灵活,一定要避免随意设置,比如避免设置同时包含oracle和mysql,当然lightdb在内部就进行了规避,如果是开源postgresql,这是需要注意的。
对于oracle兼容,上述机制对自定义函数、存储过程、视图等都可以比较好的解决。但是对于oracle包(package),无论是内置包还是用户自定义包,事情要复杂一点。在lightdb中,oracle内置包按照schema存储,走search_path机制,自定义包是在lt_package中。包括集合类型、自定义类型、sys_refcursor、函数、过程等。
标签:search,postgresql,lightdb,自定义,mysql,oracle,path From: https://www.cnblogs.com/zhjh256/p/16634472.html