36.15. �����ض���һ����չ��

һ����PostgreSQL���õ���չͨ��������� SQL �������磬һ���µ��������ͽ���Ҫ�º������²������Լ����ܵ��������������ࡣ��������Щ�����ռ���һ����һ���������ڼ����ݿ������PostgreSQL������һ����Ϊһ����չ��Ҫ����һ����չ����������Ҫһ��������������չ�Ķ����SQL������ű��ļ��Լ�һ��ָ����չ������һЩ�������Ե������ļ��������չ���� C ���룬ͨ������һ�� C ���������ɵĹ������ļ���һ����������Щ�ļ���һ���򵥵�CREATE EXTENSION������԰���Щ�������뵽������ݿ⡣

ʹ��һ����չ������ֻ����SQL�ű�����һ��"��ɢ"�������ݿ����Ҫ�ŵ��ǣ�PostgreSQL�����������չ�Ķ�����һ��ġ��������һ����һ��DROP EXTENSION����ɾ�����еĶ��󣨲���ά��һ��������"�"�ű����� ���������õ�һ���ǣ�pg_dump֪������Ӧ��ת������չ�еĸ����Ա���� — ����ֻ��ת���а���һ��CREATE EXTENSION����������Ǩ�Ƶ�һ��������ͬ�ھɰ���չ�ж�����°���չ�Ĺ�����������ע���ڰ�����һ��ת�����뵽һ�������ݿ�ʱ������չ�Ŀ��ơ��ű��������ļ�������á�

PostgreSQL��������ɾ��������һ����չ�еĸ�����󣬳���ɾ��������չ�����У���Ȼ���ܹ��ı�һ����չ�ij�Ա����Ķ��壨���磬ͨ��CREATE OR REPLACE FUNCTION�ı�һ������������ס���޸ĺ�Ķ��彫���ᱻpg_dumpת�������ָı�ͨ��ֻ�����㲢��������չ�ű��ļ���������ͬ����ʱ�������壨���Ƕ��ڰ����������ݵı�������Ĺ涨������ 36.15.3 �����������������У�ͨ�����õķ�ʽ�Ǵ���һ����չ���½ű���ִ�ж���չ�г�Ա����ĸ��ġ�

��չ�ű����ܻ�ͨ��GRANT��REVOKE���������չ�������������Ȩ��ÿһ�������������Ȩ���ϣ�����������κ���Ȩ�������洢��pg_init_privsϵͳĿ¼�С�ʹ��pg_dumpʱ��CREATE EXTENSION�����������ת���У��������ű�Ҫ��GRANT��REVOKE��伯�������������Ȩ���ó�ȡ�ø�ת��ʱ�����ӡ�

PostgreSQL��ǰ��֧����չ�ű�����CREATE POLICY����SECURITY LABEL��䡣��Щ����������Ӧ������չ��������֮�������С���������չ�����ϴ����� RLS ���ԺͰ�ȫ��ǩ������������pg_dump������ת���С�

��չ����Ҳ�Դ������һ����չ������ SQL ��������޸Ľű��й涨�����磬���һ����չ�� 1.1 �汾�� 1.0 �汾������һ���������Ҹ�������һ�������ĺ����壬����չ�����߿����ṩһ�����½ű��������������ġ���ôALTER EXTENSION UPDATE������Ա�����Ӧ����Щ���IJ��Ҹ����ڸ������ݿ���ʵ�ʰ�װ���Ǹ���չ���ĸ��汾��

����Ϊһ����չ�ij�Ա�� SQL �����������ALTER EXTENSION��ʾ�����������ݿ⼯�ط�Χ�Ķ����������ݿ⡢��ɫ�ͱ��ռ䣩������Ϊ��չ��Ա����Ϊһ����չֻ��һ�����ݿⷶΧ�ڿɼ�������һ����չ�ű���û�б���ֹ������Щ���󣬵������������޷���������Ϊ��չ��һ���������٣�����Ҫע����Ȼһ����������һ����չ�ij�Ա�����ķ��������������������ᱻֱ����Ϊ�Ǹ���չ�ij�Ա����һ���ص���ģʽ����������չ�����Ƿ��������У�һ����չ������һ�������޶������Ʋ��Ҳ��������κ�ģʽ"��"����������չ�ij�Ա����ֻҪ�������ͺ��ʾͿ�������ģʽ��һ����չӵ�а������Ա�����ģʽ���ܺ���Ҳ���ܲ����ʡ�

36.15.1. ��չ�ļ�

CREATE EXTENSION��������ÿһ����չ���еĿ����ļ��������ļ����뱻����Ϊ��չ�����Ƽ���һ����׺.control�����ұ��뱻���ڰ�װ��SHAREDIR/extensionĿ¼�С�������������һ��SQL�ű��ļ�������ѭ����ģʽextension--version.sql�����磬foo--1.0.sql��ʾ��չfoo��1.0�汾����Ĭ������£��ű��ļ�Ҳ��������SHAREDIR/extensionĿ¼�У����ǿ����ļ��п���Ϊ�ű��ļ�ָ��һ����ͬ��Ŀ¼��

һ����չ�����ļ��ĸ�ʽ��postgresql.conf�ļ���ͬ������һ��parameter_name = value��ֵ���б���ÿ��һ�����������к�#�����ע�͡�ע����κβ��ǵ�һ�ʻ����ֵ�ֵ�������š�

һ�������ļ������������в�����

directory (string)

������չ��SQL�ű��ļ���Ŀ¼�����Ǹ���һ������·�������Ŀ¼��������ڰ�װ��SHAREDIRĿ¼��Ĭ����Ϊ��Ч��ָ��directory = 'extension'��

default_version (string)

����չ��Ĭ�ϰ汾�����������CREATE EXTENSION��û��ָ���汾ʱ���ᱻ��װ����һ���������ܿ��Ժ�����������������û�г���VERSIONѡ��ʱ�ǽ��ᵼ��CREATE EXTENSIONʧ�ܣ������ͨ������ϣ����������

comment (string)

һ�����ڸ���չ��ע�ͣ������ַ���������ע�ͻ��ڳ�ʼ������չʱӦ�ã�������չ����ʱ�������ø�ע�ͣ���Ϊ���ܻḲ���û����ӵ�ע�ͣ�����չ��ע��Ҳ����ͨ���ڽű��ļ���д��COMMENT���������á�

encoding (string)

�ýű��ļ�ʹ�õ��ַ������롣���ű��ļ������κη� ASCII �ַ�ʱ������ָ����������������ļ����ᱻ�ٶ�Ϊ���ݿ���롣

module_pathname (string)

���������ֵ���������滻�ű��ļ���ÿһ�γ��ֵ�MODULE_PATHNAME��������ã�����������滻��ͨ������ᱻ����Ϊ$libdir/shared_library_name���ҽ���MODULE_PATHNAME������CREATE FUNCTION�����н��� C-���Ժ����Ĵ�������˸ýű��ļ����ذѹ����������Ӳ���������С�

requires (string)

�����չ������������չ����һ���б�������requires = 'foo, bar'������������չ�������������չ��װ��

superuser (boolean)

����������Ϊtrue��Ĭ���������ֻ�г����û��ܹ���������չ���߽������µ�һ���°汾�����������Ϊfalse��ֻ��Ҫ����ִ�а�װ��������߸��½ű�����Ȩ��

relocatable (boolean)

���һ����չ�����ڳ�ʼ����֮���������Ķ����ƶ���һ����ͬ��ģʽ�У�������relocatable��Ĭ��ֵ��false��������չ�Dz����ض�λ�ġ������ 36.15.2 ����

schema (string)

�������ֻ��Ϊ�ǿ��ض�λ��չ���á���ǿ����չ�����뵽������ģʽ�ж�������ģʽ�С�ֻ���ڳ�ʼ����һ����չʱ�Ż�ο�schema��������չ����ʱ�򲻻�ο��������������� 36.15.2 ����

������Ҫ�����ļ�extension.control��һ����չ�������ж��������ļ���������extension--version.control�ķ������������ṩ�˶��������ļ������DZ��뱻�����ڽű��ļ���Ŀ¼�С����������ļ���ѭ��Ҫ�����ļ���ͬ�ĸ�ʽ���ڰ�װ����¸���չ�İ汾ʱ��һ�����������ļ������õ��κβ�����������Ҫ�����ļ��е����á�����������directory�Լ�default_version�����ڶ��������ļ������á�

һ����չ��SQL�ű��ļ��ܹ������κ� SQL �����������������BEGIN��COMMIT�ȣ��Լ�������һ���������ִ�е������VACUUM����������Ϊ�ű��ļ��ᱻ��ʽ����һ��������б�ִ�С�

һ����չ��SQL�ű��ļ�Ҳ�ܰ�����\echo��ʼ���У���������չ���ƺ��ԣ�����ע�ͣ�������ű��ļ����͸�psql��������CREATE EXTENSION���루���� 36.15.5 ���е�ʾ���ű��������ֻ���ͨ���������׳��������û�����ֹ��ܣ��û����ܻ�����ذѸ���չ��������Ϊ"��ɢ��"���������һ������չ���룬������״̬�ָ������Ƚ��鷳��

���ܽű��ļ����԰���ָ�������������κ��ַ������ǿ����ļ�Ӧ��ֻ������ ASCII �ַ�����ΪPostgreSQLû�а취֪��һ�������ļ���ʲô���롣ʵ���ϣ������������չ��ע����ʹ�÷� ASCII �ַ�ֻ��һ�����⡣�Ƽ��ķ����Dz�ʹ�ÿ����ļ���comment����������ʹ�ýű��ļ��е�COMMENT ON EXTENSION������ע�͡�

36.15.2. ��չ���ٶ�λ��

�û�����ϣ������չ�а����Ķ������뵽һ������չ������������IJ�һ����ģʽ�С��������ֿ��ض�λ�ԣ�������֧�ֵļ���

����������£��ű��ļ�������search_pathִ�У�������ᱻ����Ϊָ��Ŀ��ģʽ��Ҳ����˵CREATE EXTENSION����Ҳ�ǵ�Ч�Ĺ�����

SET LOCAL search_path TO @extschema@;

������������ű��ļ������Ķ�����뵽Ŀ��ģʽ�С�����ű��ļ�ϣ���������Ըı�search_path���������÷�ͨ���Dz��ܻ�ӭ�ġ���CREATE EXTENSION������search_path�ᱻ�ָ���֮ǰ�����á�

��������ļ��и�����schema������Ŀ��ģʽ���ɸò�������������Ŀ��ģʽ��CREATE EXTENSION��SCHEMAѡ�����������������߶�û�и�������õ�ǰĬ�ϵĶ��󴴽�ģʽ���ڵ�����search_path�еĵ�һ��������ʹ����չ�ļ���schema����ʱ�����Ŀ��ģʽ�������ڽ�����������������������������������Ѿ����ڡ�

����ڿ����ļ��е�requires���о����κ��ȵ���չ�����ǵ�Ŀ��ģʽ�ᱻ׷�ӵ�search_path�ij�ʼ�����С�����������չ�Ľű��ļ��ܹ��������ǵĶ���

����һ�������ض�λ����չ�ܹ�����ɢ���ڶ��ģʽ�еĶ���ͨ������ֵ�ý���ͼ�����ⲿʹ�õ����ж��������һ��ģʽ�У��ⱻ��Ϊ�Ǹ���չ��Ŀ��ģʽ������һ�ְ��ſ�������������չ���������з������search_path��Ĭ������һ������

36.15.3. ��չ���ñ�

ijЩ��չ�������ñ������а����������û�����չ��װ�����ӻ��޸ĵ����ݡ�ͨ�������һ������һ����չ��һ���֣��ñ��Ķ�������ݶ����ᱻpg_dumpת�������Ƕ���һ�����ñ���˵����ϣ������������Ϊ���κ��û������������޸Ķ���Ҫ��������ת���У��������չ������֮�����Ϊ����ת��֮ǰ��ͬ��

Ҫ���������⣬һ����չ�Ľű��ļ����԰�һ���������ı��������б��Ϊ���ù�ϵ���⽫����pg_dump�Ѹñ��������е����ݣ����������Ķ��壩������ת���С�Ҫ���������ڴ�����������֮����ú���pg_extension_config_dump(regclass, text)������

CREATE TABLE my_config (key text, value text);
CREATE SEQUENCE my_config_seq;

SELECT pg_catalog.pg_extension_config_dump('my_config', '');
SELECT pg_catalog.pg_extension_config_dump('my_config_seq', '');

���������ַ���������������ı��������С���serial����bigserial�������������Ҳ���Ա���ǡ�

��pg_extension_config_dump�ĵڶ���������һ�����ַ���ʱ���ñ���ȫ�����ݶ��ᱻpg_dumpת������ͨ��ֻ���ڱ�����չ�ű�����Ϊ��ʼΪ��ʱ����ȷ������ڱ��л���г�ʼ���ݺ��û��ṩ�����ݣ�pg_extension_config_dump�ĵڶ��������ṩ��һ��WHERE������ѡ��Ҫ��ת�������ݡ����磬����ܻ���

CREATE TABLE my_config (key text, value text, standard_entry boolean);

SELECT pg_catalog.pg_extension_config_dump('my_config', 'WHERE NOT standard_entry');

����ȷ��ֻ����չ�ű�����������standard_entry��Ϊ�档

�������У��ڶ�������pg_extension_config_dumpû��Ӱ�졣

�����ӵ�����������û����ܻ��޸ij�ʼ�ṩ�����ݣ�����ͨ�������ñ��ϴ�����������������������������֤���޸ĵ��лᱻ��ȷ�ر�ǡ�

���ͨ���ٴε���pg_extension_config_dump���޸���һ�����ñ���صĹ�����������ͨ������һ����չ���½ű����ã�����һ�������Ϊ������һ�����ñ��ķ�������ALTER EXTENSION ... DROP TABLE��������չ���뿪��

ע����Щ��֮��������ϵ����ָ����Щ���� pg_dump ת����˳���ر�أ�pg_dump ������ ��ת�������õı���ת�����ñ������������ϵ���� CREATE EXTENSION ʱ�䣨�������ݱ����� �����У������ģ���״������û�н���������״��������ʱ�����ݽ���Ȼ��ת�������Ǹ�ת���޷��� ֱ�ӻָ����ұ���Ҫ�û��Ľ��롣

��serial����bigserial���������������Ҫ��ֱ�ӱ����ת�����ǵ�״̬��ֻ������ǵĸ���ϵ������ת�����ǵ�״̬��

36.15.4. ��չ����

��չ���Ƶ�һ���ŵ������ṩ�˷���ķ�����������Щ������չ�ж���� SQL ����ĸ��¡�����ͨ��Ϊ��չ�İ�װ�ű���ÿһ�����а汾����һ���汾���ƻ��߰汾��ʵ�ֵġ����⣬�����ϣ���û��ܹ���̬�ذ����ǵ����ݿ��һ���汾���µ���һ���汾����Ӧ���ṩ���½ű�������Ҫ�ĸ��ġ����½ű���������ѭextension--oldversion--newversion.sqlģʽ�����磬foo--1.0--1.1.sql�����Ű���չfoo�İ汾1.0�޸ijɰ汾1.1�������

�ٶ���һ�����ʵĸ��½ű����ã�����ALTER EXTENSION UPDATE����һ���Ѱ�װ����չ���µ�ָ�����°汾�����½ű���������CREATE EXTENSION�ṩ����װ�ű���ͬ�Ļ����У��ر���search_path�ᰴ����ͬ�ķ�ʽ���ã����Ҹýű��������κ��¶���ᱻ�Զ��ؼ��뵽��չ�С�

���һ����չ���ж��������ļ������ڸ��½ű��Ŀ��Ʋ�������Щ����Ŀ��汾��صIJ�����

���»��ƿ��Ա��������һ����Ҫ�������������һ��"��ɢ��"���󼯺�ת���һ����չ������չ���Ʊ����뵽PostgreSQL���� 9.1 ��ʼ��֮ǰ���ܶ��˱�д����չģ��򵥵ش������ָ���δ����Ķ��󡣸���һ���������������������ݿ⣬�����������ܽ���Щ����ת���һ����ȷ�������չ��������ȫ��ɾ��Ȼ����һ��CREATE EXTENSION��һ�ַ����������������֮�������������磬�����һЩ����ʹ������չ�������������ͣ�����в�ͨ��������������ķ����Ǵ���һ������չ��Ȼ��ʹ��ALTER EXTENSION ADD��ÿһ����ǰ�ʹ��ڵĶ����ŵ�����չ����󴴽��ڵ�ǰ��չ�汾�ж�����δ����汾�е��κ��¶���CREATE EXTENSION������FROM old_versionѡ��֧�������������ᵼ������ΪĿ��汾���������İ�װ�ű�������������Ϊextension--old_version--target_version.sql�ĸ��½ű���ѡ����Ϊold_versionʹ�õ���ٰ汾��������չ���ߵĹ���������unpackaged��һ��ϰ���÷���������ж�����ڰ汾��Ҫ���µ���չ���ʹ�ö����ٰ汾��������ʶ���ǡ�

ALTER EXTENSION�ܹ�ִ�и��½ű���������ʵ��һ��Ҫ��ĸ��¡����磬���ֻ��foo--1.0--1.1.sql��foo--1.1--2.0.sql���ã���ǰ��װ��1.0�汾����Ҫ����µ��汾2.0��ALTER EXTENSION������Ӧ�����ǡ�

PostgreSQL�����ٶ��κ��йذ汾���Ƶ����ʣ����磬����֪��1.1�Ƿ����1.0���档��ֻ��ƥ����õİ汾���Ʋ�������Ҫ��Ӧ�����ٸ��½ű���·�����У�һ���汾����ʵ���Ͽ����Dz���--����ǰ�����׺-���ַ�������

��ʱ�ṩ"����"�ű�Ҳ���ã�����foo--1.1--1.0.sql�����Ѱ汾1.1��صĸı�ָ�ԭ״���������������Ҫ���Ľ����ű�������Ӧ�õĿ����ԣ���Ϊ����õ�һ���϶̵�·����Σ�յ�����ǣ���һ�����������汾��"����·��"���½ű�����һ���������ÿ���·����ʼ��Ľ����ű�����Ӧ�ý���Ȼ����Ӧ�ÿ���·�����ܱ�һ������һ���汾��Ҫ���ٵIJ��衣��������汾ɾ�����κβ�������Ķ����⽫��õ����벻���Ľ����

Ҫ�������֮��ĸ���·������ʹ��������

SELECT * FROM pg_extension_update_paths('extension_name');

���Ϊָ������չ��ʾ��֪��ÿһ�������ֵİ汾���ԣ�ÿһ���汾���Ի�����һ����Դ�汾��Ŀ��汾�ĸ���·�����У����û�п��õĸ���·�����ⲿ����ϢΪNULL����·����ʾΪ��--�ָ������ı���ʽ��������ϲ�������ʽ������ʹ��regexp_split_to_array(path,'--')��

36.15.5. ��չʵ��

������һ��ֻ��SQL����չ���������ӣ�һ������Ԫ�ص�������ͣ������������IJۣ�����Ϊ"k"��"v"���д洢�κ����͵�ֵ�����ı�ֵ�ᱻ�Զ�ǿ��Ϊ�ı����д洢��

�ű��ļ�pair--1.0.sql��������������

-- ����ű����� psql ������ CREATE EXTENSION ִ�У��򱨴�
\echo Use "CREATE EXTENSION pair" to load this file. \quit

CREATE TYPE pair AS ( k text, v text );

CREATE OR REPLACE FUNCTION pair(anyelement, text)
RETURNS pair LANGUAGE SQL AS 'SELECT ROW($1, $2)::pair';

CREATE OR REPLACE FUNCTION pair(text, anyelement)
RETURNS pair LANGUAGE SQL AS 'SELECT ROW($1, $2)::pair';

CREATE OR REPLACE FUNCTION pair(anyelement, anyelement)
RETURNS pair LANGUAGE SQL AS 'SELECT ROW($1, $2)::pair';

CREATE OR REPLACE FUNCTION pair(text, text)
RETURNS pair LANGUAGE SQL AS 'SELECT ROW($1, $2)::pair;';

CREATE OPERATOR ~> (LEFTARG = text, RIGHTARG = anyelement, PROCEDURE = pair);
CREATE OPERATOR ~> (LEFTARG = anyelement, RIGHTARG = text, PROCEDURE = pair);
CREATE OPERATOR ~> (LEFTARG = anyelement, RIGHTARG = anyelement, PROCEDURE = pair);
CREATE OPERATOR ~> (LEFTARG = text, RIGHTARG = text, PROCEDURE = pair);

�����ļ�pair.control��������������

# pair ��չ
comment = 'A key/value pair data type'
default_version = '1.0'
relocatable = true

��Ȼ�㼸��������Ҫһ�� makefile ����װ�������ļ�����ȷ��Ŀ¼���㻹�ǿ���ʹ��һ��Makefile��

EXTENSION = pair
DATA = pair--1.0.sql

PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)

��� makefile ������PGXS�������� 36.16 ��������������make install���ѿ��ƺͽű��ļ���װ��pg_config�������ȷ��Ŀ¼�С�

һ���ļ�����װ��ʹ��CREATE EXTENSION����Ϳ��԰Ѷ������뵽�κ��ض������ݿ��С�