PDA

Ver la Versión Completa : Obtener el nombre de la tabla desde un trigger


JoseAntonio
09-11-2007, 22:25:55
Hola, necesito obtener en Firebird, desde el codigo del trigger, el nombre de la tabla a la que pertenece el trigger, alguien conoce alguna constante o variable que me de esa informacion? lo necesito asi por que el trigger sera copiado a muchas otras tablas y me facilitaria la tarea, gracias saludos.

Lepe
09-11-2007, 22:39:30
Pues no lo sé.

Se me ocurre usar un programa delphi con un IBScript, desde allí sería muy fácil incluir esa variable y ejecutar el Script dentro de un bucle (creando físicamente los trigger en la BD).

Los nombres de las tablas podrías sacarlo del objeto TDatabase, mira sus métodos con el code insight.

Saludos

jhonny
09-11-2007, 23:07:37
Bueno, tambien si hacemos una simple consulta a RDB$TRIGGERS podriamos traer ese dato asi:

select RDB$RELATION_NAME from RDB$TRIGGERS where RDB$TRIGGER_NAME='Nombre_del_trigger'

JoseAntonio
09-11-2007, 23:20:29
Bueno, tambien si hacemos una simple consulta a RDB$TRIGGERS podriamos traer ese dato asi:

Código SQL [-]

select RDB$RELATION_NAME from RDB$TRIGGERS where RDB$TRIGGER_NAME='Nombre_del_trigger'




Es posible... sin embargo como obtengo el nombre del trigger desde el codigo del mismo trigger?

Al González
10-11-2007, 03:32:25
¡Hola a todos!

Es posible... sin embargo como obtengo el nombre del trigger desde el codigo del mismo trigger?
Bueno, si ya estás dentro del disparador ("trigger" es disparador en inglés), se supone entonces que conoces su nombre nombre.

¿Será que tienes un procedimiento almacenado al que llamas desde disparadores de diferentes tablas, y es dentro de él donde necesitas el dato? Si ese es el caso, la solución sería que el procedimiento reciba un parámetro indicando el nombre de la tabla en cuestión.

Aunque sería muy chévere que desde cualquier procedimiento pudiéramos saber si estamos o no en el contexto de un disparador y el nombre de éste. Más concretamente, qué tabla "ha llamado" a nuestro procedimiento.

Ignoro si alguna base de datos tiene esa capacidad.

No dejes de exponer los progresos del caso.

Al González. :)

Lepe
10-11-2007, 11:10:09
Yo insisto en mi método, ya que sería extremadamente fácil, te pongo un ejemplo con generadores, que es más cortito:


const sql = ' Create generator id%s ; ';
var Tablas:TStringlist;
i:integer;
begin
tablas := TSTringlist.create;
database1.GetTablenames(tablas);
for i:=0 to tablas.count-1 do
script1.script.add(Format(sql, [tablas[i]]);

script1.Execute; // hecho, creados tantos generadores como tablas tengamos
tablas.free;
end;

El script quedaría así:

Create generator idNombretabla1 ;
Create generator idNombretabla2 ;
Create generator idNombretabla3 ;
Create generator idNombretabla4 ;


En lugar de añadir las cosas directamente al script, podemos tener un memo, donde verificamos las cosas e incluso podamos añadir más sentencias.

En este programa solo necesitas un Tdatabase, un transaction y tu ventana principal con el memo.

Tendrías las mismas posibilidades que en IB Expert, creando, eliminando triggers, etc.

Saludos