在模式上创建扩展
PostgreSQL扩展是向PostgreSQL添加功能的一种很有效的方式。尽管有大量的扩展可以被获取和使用,但是管理它们却是非常困难的。默认情况下,扩展会被加载进search_path上存在的第一个模式中。
举个例子:
图1
从图1的结果可以看出,一共有34个函数被加载进了public模式。但这样会导致管理变得非常困难,特别是当多个扩展被加载进入同一个数据库中的时候。
有一个解决办法是把每个扩展放到它自己的模式中。这个方法可以通过在加载扩展之前先设定好search_path,或者在CREATE EXTENSION命令中使用WITH SCHEMA子句来实现。
图2
图2中使用WITH SCHEMA子句在pgcrypto模式上创建了扩展。
图3
再次查看,结果如图3所示,模式都变成了pgcrypto模式。
使用这种方法创建扩展时,模式名必须是已经存在的。如果命令中未输入模式名或者扩展的控制文件中也未指定模式名,那么当前默认的对象创建模式会被使用。
需要注意的是,即使在扩展的控制文件中设定了schema这个参数,该参数的优先级也不能高于WITH SCHEMA 子句中的schema_name参数。通常情况下,如果WITH SCHEMA子句的schema_name参数和扩展控制文件中的schema参数冲突的话会产生一个error。但是如果同时存在CASCADE子句的话,当发生这种冲突时,WITH SCHEMA子句中的schema_name参数会被忽略。
因此,WITH SCHEMA子句中的schema_name参数最好用在需要安装扩展,并且扩展的控制文件中未指定schema参数值的情况。
综上所述:
每当用户想使用扩展的时候,可以先设置一下search_path,或者使用WITH SCHEMA语句创建扩展,当调用函数时,在函数名前加前缀,前缀名为模式名。
参考文献:
1、PostgreSQL 9.6.7 Documentation
2、PostgreSQL Introduction and Concepts