5.7.3. La ruta de búsqueda de esquemas
Los nombres calificados son tediosos de escribir, y a menudo es mejor no remolcar un nombre de esquema particular en las aplicaciones de todos modos. Por lo tanto, a menudo se hace referencia a las tablas mediante nombres no cualificados, que consisten únicamente en el nombre de la tabla. El sistema determina a qué tabla se refiere siguiendo una ruta de búsqueda, que es una lista de esquemas en los que buscar.La primera tabla que coincide en la ruta de búsqueda se considera la deseada. Si no hay ninguna coincidencia en la ruta de búsqueda, se informa de un error, incluso si existen nombres de tablas coincidentes en otros esquemas de la base de datos.
La posibilidad de crear objetos con nombres similares en diferentes esquemas complica la redacción de una consulta que haga referencia exactamente a los mismos objetos cada vez. También abre la posibilidad de que los usuarios cambien el comportamiento de las consultas de otros usuarios, de forma maliciosa o accidental. Debido a la prevalencia de los nombres no cualificados en las consultas y su uso en los internos de PostgreSQL, añadir un esquema a search_pathectively confía en todos los usuarios que tienen CREATEprivilege en ese esquema. Cuando se ejecuta una consulta ordinaria, un usuario malintencionado capaz de crear objetos en un esquema de su ruta de búsqueda puede tomar el control y ejecutar funciones SQL arbitrarias como si las hubiera ejecutado usted.
El primer esquema nombrado en la ruta de búsqueda se llama esquema actual. Además de ser el primer esquema en el que se busca, también es el esquema en el que se crearán las nuevas tablas si el comando CREATE TABLE no especifica un nombre de esquema.
Para mostrar la ruta de búsqueda actual, utilice el siguiente comando:
SHOW search_path;
En la configuración predeterminada esto devuelve:
search_path-------------- "$user",public
El primer elemento especifica que se debe buscar un esquema con el mismo nombre que el usuario actual. Si no existe tal esquema, la entrada se ignora. El segundo elemento se refiere al esquema público que ya hemos visto.
El primer esquema que existe en la ruta de búsqueda es la ubicación por defecto para crear nuevos objetos. Esa es la razón por la que, por defecto, los objetos se crean en el esquema público. Cuando se hace referencia a los objetos en cualquier otro contexto sin calificar el esquema (modificación de la tabla, modificación de los datos o comandos de consulta), la ruta de búsqueda se recorre hasta que se encuentra un objeto que coincida. Por lo tanto, en la configuración por defecto, cualquier acceso no cualificado sólo puede referirse al esquema público.
Para poner nuestro nuevo esquema en la ruta, utilizamos:
SET search_path TO myschema,public;
(Omitimos el $usuario aquí porque no tenemos necesidad inmediata de él.) Y entonces podemos acceder a la tabla sin calificar el esquema:
DROP TABLE mytable;
Además, como myschema es el primer elemento de la ruta, los nuevos objetos se crearían por defecto init.
También podríamos haber escrito:
SET search_path TO myschema;
Entonces ya no tenemos acceso al esquema público sin calificación explícita. El esquema público no tiene nada de especial, salvo que existe por defecto. También se puede eliminar.
Véase también la Sección 9.25 para conocer otras formas de manipular la ruta de búsqueda del esquema.
La ruta de búsqueda funciona de la misma forma para los nombres de tipos de datos, nombres de funciones y nombres de operadores que para los nombres de tablas. Los nombres de tipos de datos y de funciones pueden calificarse exactamente de la misma manera que los nombres de tablas. Si necesita escribir un nombre de operador cualificado en una expresión, existe una disposición especial: debe escribir
OPERATOR(schema.operator)
Esto es necesario para evitar la ambigüedad sintáctica. Un ejemplo es:
SELECT 3 OPERATOR(pg_catalog.+) 4;
En la práctica se suele confiar en la ruta de búsqueda de operadores, para no tener que escribir algo tan feo como eso.