Dado que los objetos en el pg_catalog
esquema están implícitamente en search_path
( docs ), ¿se recomendaría instalar extensiones en ese esquema?
Dado que los objetos en el pg_catalog
esquema están implícitamente en search_path
( docs ), ¿se recomendaría instalar extensiones en ese esquema?
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 EXTENSION
no 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_path
para 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 extensions
esquema detrás de objetos del mismo nombre (y parámetros) en el public
esquema.
Relacionado:
plpgsql
extensión, entonces de alguna manera una excepción a esta regla? Cada instalación que he visto tiene esta extensión en pg_catalogIn 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.
pg_catalog
mismo. (Se produce un error si intenta cambiarlo). ¿Es esto quizás un estándar para instalar extensiones de lenguaje de procedimiento para funciones?Instalar extensiones en
pg_catalog
, por lo que yo sé, no es aconsejable. Debe usar elpublic
esquema predeterminado , que también está en elsearch_path
predeterminado.¿Por qué?
Como ejemplo, trabajaré con la
pageinspect
extensión que ya he creado dentro delpublic
esquema. Todas las funciones son, de forma predeterminada, accesibles para todos los esquemas de la base de datos si se encuentran en elpublic
esquema.Ahora, trato de moverlo al
pg_catalog
esquema, usandoY funciona bien.
Pero...
Intente moverlo nuevamente, de vuelta al
public
esquema usandoy no lo permitirá, produciendo el siguiente error
¡UH oh! Bueno, está bien que no me permita moverlo. Puedo regresarlo al
public
esquema soltándolo y volviendo a crearlo, ¿verdad? ...Bien. De vuelta en su lugar correcto en el
public
esquema, y las funciones aún son accesibles para todos los esquemas en la base de datos.TL, DR; Simplemente use el
public
esquema predeterminado para las extensiones.fuente