-- Function: tr_datos_d()

-- DROP FUNCTION tr_datos_d();

CREATE OR REPLACE FUNCTION tr_datos_d()
  RETURNS trigger AS
$BODY$declare sql varchar = null ;
declare v_codigo varchar(100)  ;
DECLARE V_COD bigint =0 ;
DECLARE V_COD2 VARCHAR(100) ;
BEGIN

RAISE NOTICE 'trigger !!!!!! DOMINIO % NAME=% WHEN=% LEVEL=% RELID=%
RELNAME=% TABLENAME=% SCHEMA=% NARGS=%', TG_OP,TG_NAME,TG_WHEN
,TG_LEVEL,TG_RELID,TG_RELNAME,TG_TABLE_NAME,TG_TABLE_SCHEMA,TG_NARGS ;

IF TG_OP='INSERT' THEN
V_COD = NEW.ID ;
V_COD2 = NEW.CODIGO;
end if;

IF TG_OP='DELETE' THEN
        V_COD = OLD.ID ;
        V_COD2 = OLD.CODIGO;

END IF;

IF  TG_OP='UPDATE' THEN
V_COD = NEW.ID ;
V_COD2 = NEW.CODIGO;
END IF;

RAISE NOTICE 'COD2  %',OLD.CODIGO ;
RAISE NOTICE 'VIEJO %',OLD.ID ;

select   getid_codigo_off_dominio( V_COD ) into v_codigo ;
RAISE NOTICE 'DOMINIO de id= %  corresponde a codigo = %',V_COD ,v_codigo  ;

if ( v_codigo = '' ) then
/* no encuentra ese id en la tabla de dominios  */
  return NEW ;
end if ;


RAISE NOTICE 'CODIGO %', v_codigo  ;
case v_codigo

when 'NACIONALIDADES' THEN

 IF TG_OP='INSERT' THEN
 -- Conectate con dblink, crea la coneccion
 perform  dblink_connect ('....' ::text );
-- Usa la conexion

 RAISE NOTICE 'trigger 2 ' ;
sql = 'INSERT INTO nacionalidades(id_nacionalidad ,nacionalidad) VALUES(';
 sql = sql ||  quote_literal(to_string( NEW.id,'999999999999999999'))  || '
,' ;
sql = sql || quote_literal(NEW.nombre)  || ' );' ;

RAISE NOTICE 'trigger %',NEW.id  ;
RAISE NOTICE 'sql  %',sql  ;
 perform   dblink_exec(sql  ::text );

-- Cierra la conección
 perform  dblink_disconnect();

RETURN NEW;
 END IF;
 IF TG_OP='DELETE' THEN
 sql = 'DELETE FROM  nacionalidades WHERE id_nacionalidad =' ||
quote_literal(OLD.ID ,'999999999999999999')  || ' ;' ;
 perform   dblink_exec(sql  ::text );
perform  dblink_disconnect();
RETURN OLD;
 END IF ;
IF TG_OP='UPDATE' THEN
    RAISE NOTICE 'NEW   %',NEW.CODIGO  ;
    RAISE NOTICE 'OLD   %',OLD.CODIGO  ;
    sql = 'update nacionalidades set nacionalidad =' || quote_literal(
OLD.CODIGO  ) || '  where nacionalidades.id_nacionalidad=' ||
quote_literal(  OLD.ID ::integer  ) ;
    perform   dblink_exec(sql  ::text );
    perform  dblink_disconnect();
    RETURN NEW;
END IF;

WHEN 'SEXOS' then

 /*
CREATE TABLE lista_genero
(
  id_genero character varying(25) NOT NULL,
  descripcion_genero character varying(255),
  CONSTRAINT cslista_generoprimarykey PRIMARY KEY (id_genero)
)
*/

IF TG_OP='INSERT' THEN
 -- Conectate con dblink, crea la coneccion
 perform  dblink_connect ('....' ::text );
-- Usa la conexion

 RAISE NOTICE 'trigger 2 ' ;
sql = 'INSERT INTO lista_genero (id_genero ,descripcion_genero) VALUES(';
 sql = sql ||  quote_literal(to_string( NEW.id,'999999999999999999'))  || '
,' ;
sql = sql || quote_literal(NEW.nombre)  || ' );' ;

RAISE NOTICE 'trigger %',NEW.id  ;
RAISE NOTICE 'sql  %',sql  ;
 perform   dblink_exec(sql  ::text );

-- Cierra la conección
 perform  dblink_disconnect();

RETURN NEW;
 END IF ;
IF TG_OP='DELETE' THEN
sql = 'DELETE FROM  lista_genero WHERE id_genero =' ||
quote_literal(OLD.ID,'999999999999999999')  || ' ;' ;
 perform   dblink_exec(sql  ::text );
perform  dblink_disconnect();
RETURN OLD;
 END IF;
 IF TG_OP='UPDATE' THEN
     sql = 'update lista_genero set descripcion_genero =' || quote_literal(
NEW.CODIGO ::INTEGER  ) || '  where lista_genero.id_genero=' ||
quote_literal(NEW.ID ::INTEGER )  || ' ;'  ;

    perform   dblink_exec(sql  ::text );
    perform  dblink_disconnect();
    RETURN NEW;
END IF;





when 'ESTADO_CIVIL' THEN
/*

CREATE TABLE lista_estadocivil
(
  id_estado_civil character varying(25) NOT NULL,
  descripcion_estado_civil character varying(255),
  CONSTRAINT cslista_estadocivilprimarykey PRIMARY KEY (id_estado_civil)
)
*/
IF TG_OP='INSERT' THEN
 -- Conectate con dblink, crea la coneccion
perform  dblink_connect ('.....' ::text );
 -- Usa la conexion

RAISE NOTICE 'trigger 2 ' ;
sql = 'INSERT INTO lista_estadocivil(id_estadocivil
,descripcion_estado_civil) VALUES(';
 sql = sql ||   quote_literal( NEW.id,'999999999999999999')  || ' ,' ;
sql = sql || quote_literal(NEW.nombre)  || ' );' ;

RAISE NOTICE 'trigger %',NEW.id  ;
RAISE NOTICE 'sql  %',sql  ;
 perform   dblink_exec(sql  ::text );

-- Cierra la conección
 perform  dblink_disconnect();
RETURN NEW;
 END IF;
IF TG_OP='DELETE' THEN
sql = 'DELETE FROM  lista_estadocivil  WHERE id_estadocivil  =' ||
quote_literal(OLD.ID ,'999999999999999999')  || ' ;' ;
 perform   dblink_exec(sql  ::text );
perform  dblink_disconnect();
RETURN OLD;
 END IF;
IF TG_OP='UPDATE' THEN
    RAISE NOTICE 'NEW   %',NEW.CODIGO  ;
    RAISE NOTICE 'OLD   %',OLD.CODIGO  ;
    sql = 'update lista_estadocivil set descripcion_estado_civil  =' ||
quote_literal(V_COD ::integer ) ||'  where id_estadocivil = ' ||
quote_literal(NEW.ID ::integer ) ;
    perform   dblink_exec(sql  ::text );
    perform  dblink_disconnect();
    RETURN NEW;
END IF;


when 'TIPOS_DOC' then

/*
CREATE TABLE tiposdocumento
(
  tipo_documento character varying(20) NOT NULL,
  descripcion character varying(150) DEFAULT ''::character varying,
  CONSTRAINT cstiposdocumentoprimarykey PRIMARY KEY (tipo_documento)
)
*/

IF TG_OP='INSERT' THEN
 -- Conectate con dblink, crea la coneccion
 perform  dblink_connect ('...' ::text );
-- Usa la conexion

 RAISE NOTICE 'trigger 2 ' ;
sql = 'INSERT INTO tiposdocumento (tipo_documento ,descripcion) VALUES(';
 sql = sql ||   quote_literal( NEW.id,'999999999999999999')  || ' ,' ;
sql = sql || quote_literal(NEW.nombre)  || ' );' ;

RAISE NOTICE 'trigger %',NEW.id  ;
RAISE NOTICE 'sql  %',sql  ;
 perform   dblink_exec(sql  ::text );

-- Cierra la conección
 perform  dblink_disconnect();

RETURN NEW;
 ELSEIF TG_OP='DELETE' THEN
sql = 'DELETE FROM  tiposdocumento  WHERE tipo_documento  =' ||
quote_literal(OLD.ID ,'999999999999999999')  || ' ;' ;
 perform   dblink_exec(sql  ::text );
perform  dblink_disconnect();
RETURN OLD;
 ELSEIF TG_OP='UPDATE' THEN
    sql = 'update tiposdocumento set descripcion  =' || quote_literal(
NEW.codigo) ||'  where tipo_documento = ' ||
quote_literal(NEW.ID,'999999999999999999') ;
    perform   dblink_exec(sql  ::text );
    perform  dblink_disconnect();
    RETURN NEW;
END IF;


ELSE

  RETURN new;
END CASE ;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION tr_datos_d()
  OWNER TO postgres;


2012/11/6 Pedro Ricardo <[email protected]>

> Hombre pon el trigger para ver como lo tienes declarado ...
>
>
> 2012/11/6 Juan <[email protected]>
>
>> Gente
>>
>> Tengo un trigger declarado en una tabla, declarada de la sig. manera
>>
>>
>> -- Table: dato_d
>>
>> -- DROP TABLE dato_d;
>>
>> CREATE TABLE dato_d
>> (
>>   id bigserial NOT NULL,
>>   fecha_alta timestamp without time zone NOT NULL,
>>   fecha_baja timestamp without time zone,
>>   fecha_ult_mod timestamp without time zone NOT NULL,
>>   usuario_alta character varying(50) NOT NULL,
>>   usuario_baja character varying(50),
>>   usuario_ult_mod character varying(50) NOT NULL,
>>   codigo character varying(30),
>>   inactivo integer,
>>   nombre character varying(255),
>>   id_dominio bigint,
>>   CONSTRAINT d_pkey PRIMARY KEY (id),
>>   CONSTRAINT sdgdgdfgdfgdfgdFOREIGN KEY (id_dominio)
>>       REFERENCES d (id) MATCH SIMPLE
>>       ON UPDATE NO ACTION ON DELETE NO ACTION
>> )
>> WITH (
>>   OIDS=FALSE
>> );
>> ALTER TABLE dato_d
>>   OWNER TO tsuser;
>>
>> -- Trigger: tr_datos_d on dato_d
>>
>> -- DROP TRIGGER tr_datos_dom ON dato_d;
>>
>> CREATE TRIGGER tr_datos_d
>>   BEFORE INSERT OR UPDATE OR DELETE
>>   ON dato_d
>>   FOR EACH ROW
>>   EXECUTE PROCEDURE tr_datos_d();
>>
>>
>> PERO: en mi trigger tengo un if por delete or update or insert
>>
>> segun entendi el trigger llama con un "parametro" NEW  u OLD
>> representando la row que se altera,
>> Para testear esta funcionalidad le hice un update
>> update dato_d set fecha_baja = fecha_baja  ;
>> No modifico nada, pero lo que motiva este corre es que algunas veces
>> parece que el OLD y el NEW vienen en null
>> de manera que si intento acceder a el campo id me sale el error 'valor no
>> inicializado'
>>
>> cualquier ayuda sera agradecido.
>> saludos
>>
>
>
>
> --
> *System.out.println('P');
> for(int i=0; i<10; i++){  System.out.print('i');  }
> System.out.print('dro');*
>
> *Staff :: Hadess_inf - www.foro.elhacker.net**
> *
>
>

Responder a