Saltar al contenido

¿Cómo influye search_path en la resolución del identificador y el “esquema actual”?

Indagamos en distintos sitios para así traerte la solución para tu inquietud, si tienes preguntas déjanos tu duda y te respondemos con gusto.

Solución:

¿Qué es la ruta de búsqueda de esquema? search_path?

El manual:

[…] a menudo se hace referencia a las tablas con nombres no calificados, que consisten solo 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 para buscar en.

Énfasis en negrita mío. Esto explica resolución de identificador.

El “esquema actual” (o “esquema predeterminado”) es, según la documentación:

El primer esquema nombrado en la ruta de búsqueda se llama el esquema actual. Además de ser el primer esquema buscado, también es el esquema en el que se crearán nuevas tablas si el CREATE TABLE El comando no especifica un nombre de esquema.

Énfasis en negrita mío. Los esquemas del sistema pg_temp (esquema para objetos temporales de la sesión actual) y pg_catalog son automáticamente parte de la ruta de búsqueda y buscados primero, en este orden. El manual:

pg_catalog es siempre efectivamente parte de la ruta de búsqueda. Si no se nombra explícitamente en la ruta, entonces se busca implícitamente antes de
buscando los esquemas del camino. Esto garantiza que los nombres integrados siempre se puedan encontrar. Sin embargo, puede colocar explícitamente pg_catalog al final de su ruta de búsqueda si prefiere que los nombres definidos por el usuario anulen los nombres integrados.

Énfasis en negrita según el original. Y pg_temp viene antes de eso, a menos que se ponga en una posición diferente.

¿Cómo configurarlo?

Hay varias formas de establecer la variable de tiempo de ejecución search_path.

  1. Establecer un grupo-amplio valor predeterminado para todos los roles en todas las bases de datos en postgresql.conf (y recargar). ¡Cuidado con eso!

    search_path = 'blarg,public'
    

    El valor predeterminado enviado para esta configuración es:

    search_path = "$user",public
    

    El primer elemento especifica que se buscará un esquema con el mismo nombre que el usuario actual. Si no existe tal esquema, la entrada se ignora.

  2. Establézcalo como predeterminado para uno base de datos:

    ALTER DATABASE test SET search_path = blarg,public;
    
  3. Establézcalo como predeterminado para el papel con el que se conecta (efectivo en todo el clúster):

    ALTER ROLE foo SET search_path = blarg,public;
    
  4. O incluso (¡a menudo mejor!) por defecto para un papel en una base de datos:

    ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;
    
  5. Escriba el comando en la parte superior de su secuencia de comandos. O ejecutarlo en su base de datos sesión:

    SET search_path = blarg,public;
    
  6. Establecer un específico search_path Para el alcance de una función (para estar a salvo de usuarios maliciosos con suficientes privilegios). Leer sobre Escritura SECURITY DEFINER Funciones seguras en el manual.

CREATE FUNCTION foo() RETURNS void AS
$func$
BEGIN
   -- do stuff
END
$func$ LANGUAGE plpgsql SECURITY DEFINER
       SET search_path=blarg,public,pg_temp;

El número más alto en mi lista triunfa sobre el número más bajo.
el manual tiene aún más formas, como establecer variables de entorno o usar opciones de línea de comandos.

Para ver la configuración actual:

SHOW search_path;

Para restablecerlo:

RESET search_path;

El manual:

El valor por defecto se define como el valor que habría tenido el parámetro, si no SET alguna vez se ha emitido para él en la sesión actual.

La ruta de búsqueda es de hecho lo que quieres:

% create schema blarg;
% set search_path to blarg;
% create table foo (id int);
% d
       List of relations
 Schema | Name | Type  | Owner 
--------+------+-------+-------
 blarg  | foo  | table | pgsql

Comentarios y calificaciones del artículo

Si entiendes que ha sido provechoso nuestro post, sería de mucha ayuda si lo compartieras con el resto entusiastas de la programación así nos ayudas a extender nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *