Respuestas:
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:
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.
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 el public
esquema predeterminado , que también está en el search_path
predeterminado.
Como ejemplo, trabajaré con la pageinspect
extensión que ya he creado dentro del public
esquema. Todas las funciones son, de forma predeterminada, accesibles para todos los esquemas de la base de datos si se encuentran en el public
esquema.
Ahora, trato de moverlo al pg_catalog
esquema, usando
ALTER EXTENSION pageinspect SET SCHEMA pg_catalog;
Y funciona bien.
Pero...
Intente moverlo nuevamente, de vuelta al public
esquema 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 public
esquema soltándolo y volviendo a crearlo, ¿verdad? ...
DROP EXTENSION pageinspect;
CREATE EXTENSION pageinspect;
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.
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_catalog