¿Se recomienda instalar extensiones en el esquema pg_catalog?


Respuestas:


16

No instalar extensiones para pg_catalog(a menos que ese es su defecto: muy pocas extensiones están diseñados de esa manera), ya que no se metan con catálogo del sistema, jamás . @ Chris demuestra una razón por la cual. Hay otros.

Sin embargo, el esquema "público" no es de ninguna manera especial . Es solo el esquema predeterminado que está preinstalado en distribuciones estándar para que podamos comenzar de inmediato. Algunos administradores de bases de datos no utilizan el esquema "público" en absoluto, algunos incluso lo eliminan.

CREATE EXTENSIONno está afiliado al esquema "público". Se instala en el esquema actual a menos que se indique lo contrario, excepto que algunas extensiones tienen un esquema preestablecido (como PGQ / Londiste ). La documentación:

nombre_esquema

El nombre del esquema en el que instalar los objetos de la extensión, dado que la extensión permite que su contenido se reubique. El esquema nombrado ya debe existir. Si no se especifica, y el archivo de control de la extensión tampoco especifica un esquema, se utiliza el esquema de creación de objetos predeterminado actual .

Recuerde que la extensión en sí no se considera dentro de ningún esquema: las extensiones tienen nombres no calificados que deben ser únicos en toda la base de datos. Pero los objetos que pertenecen a la extensión pueden estar dentro de esquemas.

El énfasis audaz es mío.
Decide cómo administrar usuarios, esquemas y search_path:

Luego decida dónde instalar las extensiones. Puede instalar en cualquier esquema de su elección e incluir ese esquema en el valor predeterminado search_pathpara todos los usuarios o solo para algunos o ninguno (para que se requieran referencias calificadas). Todo depende de lo que quieras lograr.
Hagas lo que hagas, mantente constante.

Me gusta instalar extensiones (que lo permiten) en un esquema de "extensiones" dedicado, que incluyo en el valor predeterminado search_path después de "public" (y "$ user", si lo usa). Ayuda con una separación limpia de mis propias funciones públicas y otros objetos públicos. Mi configuración en postgresql.conf:

search_path = "$user",public,extensions

O:

search_path = public,extensions

E instalo extensiones con:

CREATE EXTENSION some_extension SCHEMA extensions;

Una cosa a tener en cuenta: de esta manera puede "ocultar" objetos (no calificados) en el extensionsesquema detrás de objetos del mismo nombre (y parámetros) en el publicesquema.

Relacionado:


ok es la plpgsqlextensión, entonces de alguna manera una excepción a esta regla? Cada instalación que he visto tiene esta extensión en pg_catalog
zam6ak

@ zam6ak: Sí, plpgsql es un caso un poco especial: Citando el manual :In PostgreSQL 9.0 and later, PL/pgSQL is installed by default. However it is still a loadable module, so especially security-conscious administrators could choose to remove it.
Erwin Brandstetter

1
plv8 también se instala a sí pg_catalogmismo. (Se produce un error si intenta cambiarlo). ¿Es esto quizás un estándar para instalar extensiones de lenguaje de procedimiento para funciones?
jpmc26

6

Instalar extensiones en pg_catalog, por lo que yo sé, no es aconsejable. Debe usar el publicesquema predeterminado , que también está en el search_pathpredeterminado.

¿Por qué?

Como ejemplo, trabajaré con la pageinspectextensión que ya he creado dentro del publicesquema. Todas las funciones son, de forma predeterminada, accesibles para todos los esquemas de la base de datos si se encuentran en el publicesquema.

Ahora, trato de moverlo al pg_catalogesquema, usando

ALTER EXTENSION pageinspect SET SCHEMA pg_catalog;

Y funciona bien.

Pero...

Intente moverlo nuevamente, de vuelta al publicesquema usando

ALTER EXTENSION pageinspect SET SCHEMA public;

y no lo permitirá, produciendo el siguiente error

ERROR: cannot remove dependency on schema pg_catalog because it is a system object
SQL state: 0A000

¡UH oh! Bueno, está bien que no me permita moverlo. Puedo regresarlo al publicesquema soltándolo y volviendo a crearlo, ¿verdad? ...

DROP EXTENSION pageinspect;
CREATE EXTENSION pageinspect;

Bien. De vuelta en su lugar correcto en el publicesquema, y ​​las funciones aún son accesibles para todos los esquemas en la base de datos.

TL, DR; Simplemente use el publicesquema predeterminado para las extensiones.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.