Crear un trigger en alter table.

Lists: pgsql-es-ayuda
From: Jose Mario Trujillo <miactin(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Crear un trigger en alter table.
Date: 2025-03-04 05:14:46
Message-ID: CABh0hjRXTJOM1SVfhqmnSOqVFK2LvgEuZTD24KY4Kpgz2Bnppw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Saludos,

Estoy buscando la forma de crear un trigger, lo que busco es que si se
agrega un atributo a una tabla, este se agregue tambien a a otra tabla.

Este es el codigo que tengo, pero la verdad no he podido ni imprimir las
linas de depuracion.

CREATE OR REPLACE FUNCTION sync_test_base_claims()

RETURNS event_trigger

LANGUAGE plpgsql

AS $$

DECLARE

stmt TEXT;

BEGIN

RAISE NOTICE 'Trigger activated! Checking for ALTER TABLE commands...';

FOR stmt IN

SELECT 'ALTER TABLE public.test_base_claims ' || substring(command_tag, 12)

FROM pg_event_trigger_ddl_commands()

WHERE command_tag LIKE 'ALTER TABLE public.claims%'

LOOP

RAISE NOTICE 'Executing: SQL%', stmt;

EXECUTE stmt;

END LOOP;

END;

$$;

CREATE EVENT TRIGGER sync_test_base_claims_trigger

ON ddl_command_end

WHEN TAG IN ('ALTER TABLE')

EXECUTE FUNCTION sync_test_base_claims();

ALTER table public.claims ENABLE TRIGGER ALL

Algun consejo?

Jose Mario Trujillo
2B5F B819 533E B033 AD55 D965 A2B5 D2AF 0FDF 371E


From: Anthony Sotolongo <asotolongo(at)gmail(dot)com>
To: Jose Mario Trujillo <miactin(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Crear un trigger en alter table.
Date: 2025-03-05 19:32:37
Message-ID: CAASDfF1x6DerT2e+UcJzPxL_xCxGs2oF++Dch6qJF=ZGW1BfQg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Hola Jose, si entiendo bien lo que necesitas, esto lo vas a tener que hacer
llevando tú los metadatos de las tablas, pues acceder a *comand* (plano) del
la funcion *pg_event_trigger_ddl_commands* puede sercomplicado, pues como
dice la doc este campo es : "A complete representation of the command, in
internal format. This cannot be output directly, but it can be passed to
other functions to obtain different pieces of information about the
command." y es un tipo bastante diferente *pg_ddl_command*. Detalle aparte,
en el campo *command_tag* vas a encontrar los tags listados en
*https://www.postgresql.org/docs/current/event-trigger-matrix.html
<https://www.postgresql.org/docs/current/event-trigger-matrix.html>*, no el
nombre de la tabla. el cual puedes encontrar en *schema_name.*

*Saludos*

El mar, 4 mar 2025 a las 2:15, Jose Mario Trujillo (<miactin(at)gmail(dot)com>)
escribió:

> Saludos,
>
> Estoy buscando la forma de crear un trigger, lo que busco es que si se
> agrega un atributo a una tabla, este se agregue tambien a a otra tabla.
>
>
> Este es el codigo que tengo, pero la verdad no he podido ni imprimir las
> linas de depuracion.
>
> CREATE OR REPLACE FUNCTION sync_test_base_claims()
>
> RETURNS event_trigger
>
> LANGUAGE plpgsql
>
> AS $$
>
> DECLARE
>
> stmt TEXT;
>
> BEGIN
>
> RAISE NOTICE 'Trigger activated! Checking for ALTER TABLE commands...';
>
> FOR stmt IN
>
> SELECT 'ALTER TABLE public.test_base_claims ' || substring(command_tag, 12
> )
>
> FROM pg_event_trigger_ddl_commands()
>
> WHERE command_tag LIKE 'ALTER TABLE public.claims%'
>
> LOOP
>
> RAISE NOTICE 'Executing: SQL%', stmt;
>
> EXECUTE stmt;
>
> END LOOP;
>
> END;
>
> $$;
>
>
>
> CREATE EVENT TRIGGER sync_test_base_claims_trigger
>
> ON ddl_command_end
>
> WHEN TAG IN ('ALTER TABLE')
>
> EXECUTE FUNCTION sync_test_base_claims();
>
>
> ALTER table public.claims ENABLE TRIGGER ALL
>
> Algun consejo?
>
>
> Jose Mario Trujillo
> 2B5F B819 533E B033 AD55 D965 A2B5 D2AF 0FDF 371E
>


From: "Romero, Fernando" <Fernando(dot)Romero(at)trenesargentinos(dot)gob(dot)ar>
To: Jose Mario Trujillo <miactin(at)gmail(dot)com>, "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: Crear un trigger en alter table.
Date: 2025-03-06 15:52:40
Message-ID: 2a447eb59ed04ce591f8271df6eea85a@trenesargentinos.gob.ar
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

hola Jose como estas
Lo que veo yo, por ahi estoy equivocado, en el comando ALTER TABLE dentro del loop estás concatenando la cadena de comandos de ALTER TABLE sin una validación de si es correcto.
Miraria un poco las condiciones, el pg_event_trigger_ddl_commands ommand_tag devuelve un identificador del tipo de comando (como ALTER TABLE, CREATE TABLE, etc.), y al hacer un substring puede que estes trayendo un resultado que no es.
Donde definis el evento me parece que la cláusula WHEN TAG IN ('ALTER TABLE') no captura bien el filtro de ALTER TABLE public.claims% como si lo captura en la función.
Por ahí alguien con mas experiencia te da un panorama mejor.

Saludos
De: Jose Mario Trujillo [mailto:miactin(at)gmail(dot)com]
Enviado el: martes, 4 de marzo de 2025 02:15
Para: pgsql-es-ayuda(at)postgresql(dot)org
Asunto: Crear un trigger en alter table.

CUIDADO: Este correo es externo a TRENES ARGENTINOS, no abras vinculos ni completes formularios de origenes desconocidos.

Saludos,

Estoy buscando la forma de crear un trigger, lo que busco es que si se agrega un atributo a una tabla, este se agregue tambien a a otra tabla.

Este es el codigo que tengo, pero la verdad no he podido ni imprimir las linas de depuracion.

CREATE OR REPLACE FUNCTION sync_test_base_claims()

RETURNS event_trigger

LANGUAGE plpgsql

AS $$

DECLARE

stmt TEXT;

BEGIN

RAISE NOTICE 'Trigger activated! Checking for ALTER TABLE commands...';

FOR stmt IN

SELECT 'ALTER TABLE public.test_base_claims ' || substring(command_tag, 12)

FROM pg_event_trigger_ddl_commands()

WHERE command_tag LIKE 'ALTER TABLE public.claims%'

LOOP

RAISE NOTICE 'Executing: SQL%', stmt;

EXECUTE stmt;

END LOOP;

END;

$$;

CREATE EVENT TRIGGER sync_test_base_claims_trigger

ON ddl_command_end

WHEN TAG IN ('ALTER TABLE')

EXECUTE FUNCTION sync_test_base_claims();

ALTER table public.claims ENABLE TRIGGER ALL

Algun consejo?

Jose Mario Trujillo
2B5F B819 533E B033 AD55 D965 A2B5 D2AF 0FDF 371E
“El contenido del presente mensaje (y sus anexos) es privado, confidencial y de exclusivo uso para el destinatario referenciado; es de público conocimiento que las comunicaciones por medio de Internet no permiten asegurar ni garantizar la confidencialidad de los mensajes transmitidos, así como tampoco su integridad o su correcta recepción; es por ello que SOFSE no se responsabiliza de posibles perjuicios derivados de la captura, incorporaciones de virus o cualquier otra manipulación efectuada por terceros. Las opiniones expresadas en este mensaje y en los archivos adjuntos son propias del remitente y no representan la opinión o políticas de SOFSE, salvo que se diga expresamente y el remitente se encuentre autorizado para ello”