tutorial - trigger postgresql auditoria
Postgresql inserta el disparador para establecer el valor (2)
Es posible, pero es probable que sea mejor configurar una restricción predeterminada en la columna. Al crear la tabla que se vería así:
create table mytable as (
C1 thetype not null default X
);
Esto dice que si agrega una fila a la tabla y no especifica el valor para C1, entonces se usará X en su lugar. El no nulo no es necesario, pero evita que las actualizaciones anulen esa columna suponiendo que eso es lo que desea.
EDITAR: Esto solo funciona para la constante X, de tus comentarios parece que hay dos posibles soluciones.
Usar un disparador se vería así:
create function update_row_trigger() returns trigger as $$
begin
if new.C1 is NULL then
new.C1 := X;
end if;
return new;
end
$$ language plpgsql;
create trigger mytrigger before insert on mytable for each row execute procedure update_row_trigger();
La new
variable en una función de disparo es especial y representa la fila que se está insertando. Especificar el desencadenador como un desencadenante de before insert
significa que puede modificar la fila antes de escribirla en la tabla.
La segunda solución sería usar una columna calculada que Postgres define de una manera inusual:
create or replace function C1(row mytable) returns columntype immutable as $$
begin
return X; -- where X is an expression using values from `row`
end
$$ language plpgsql;
Esto crea una función que toma una fila de su tabla y devuelve un valor, puede llamarlo usando. notación, lo que significa que puede hacer:
select
*,
t.C1
from
mytable t;
La declaración de que la función es inmutable es opcional, pero es necesaria si desea indexar la "columna". Podrías indexar esta columna así:
create index on mytable (C1(mytable));
Supongamos en Postgresql, tengo una tabla T
y una de sus columnas es C1
.
Quiero activar una función cuando se agrega un nuevo registro a la tabla T
La función debe verificar el valor de la columna C1
en el nuevo registro y si es nula / vacía, entonces establezca su valor en ''X''
.
es posible?
Tiene razón en que necesita un desencadenador, porque el establecimiento de un valor predeterminado para la columna no le servirá: los valores predeterminados solo funcionan para valores null
y no lo ayudan a evitar valores en blanco.
En Postgres hay un par de pasos para crear un desencadenador:
Paso 1: crea una función que devuelve el tipo trigger
:
CREATE FUNCTION my_trigger_function()
RETURNS trigger AS ''
BEGIN
IF NEW.C1 IS NULL OR NEW.C1 = '''''''' THEN
NEW.C1 := ''''X'''';
END IF;
RETURN NEW;
END'' LANGUAGE ''plpgsql''
Paso 2: cree un desencadenador que se active antes de la inserción, que le permite cambiar los valores antes de que se inserten, que invoca la función anterior:
CREATE TRIGGER my_trigger
BEFORE INSERT ON T
FOR EACH ROW
EXECUTE PROCEDURE my_trigger_function()
Y tu estas listo.
¡Vea el código anterior ejecutándose en SQLFIddle demostrando que funciona correctamente!
Menciona en un comentario que el valor ''X''
se recupera de una subconsulta. Si es así, cambie la línea relevante de modo que tenga algo como:
NEW.C1 := (select some_column from some_table where some_condition);