SQL - AYUDAA URGENTE CO UNOS TRIGGERS

 
Vista:

AYUDAA URGENTE CO UNOS TRIGGERS

Publicado por Alejandra (6 intervenciones) el 08/09/2004 22:22:17
Hola, les escribo porque necesito de su ayuda urgentemente. Estoy haciendo una aplicación en sql server 7, y deseo implementar triggers para lo siguiente:

* Yo tengo una tabla Equipos y otra Equipo_Asignado_Empleado, entonces yo quiero que al reasignar un equipo a otro empleado, tanto la asignación nueva como la anterior estén en el archivo (tabla) histórico, pero que la asignación anterior sea SUSTITUIDA por la nueva en la tabla Equipo_Asignado_Empleado.
Esto es como para mantener un archivo histórico de todos las asignaciones hechas de todos los equipos en general, y en mi tabla Equipo_Asignado_Empleado tener sólo la asignación actual de ese equipo.

* Tambien necesito un trigger que me sirva para que cada vez que elimine una tupla determinada de una tabla, automáticamente se eliminen de las tablas que hacen referencia a dicha tabla. (Un ejemplo podría enfocarse a si yo elimino un determinado equipo, deben eliminarse todas las asignaciones de esos equipos, y toda esta informacion eliminada (de ambas tablas) pasará al archivo de históricos correspondiente).

Este es un código que amolde a mis necesidades, ok al insertar una asignacion_equipo, se inserta automáticamente en mi tabla de historicos, pero lo que no hace es que cuando inserto una asignacion de ese mismo equipo a otra persona, deberia sustituir la asignación anterior (esto es en la tabla Asignación_Equipos):

en otro mensaje le envio el codigo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:CODIGO FUENTE

Publicado por Alejandra (6 intervenciones) el 08/09/2004 22:27:14
--Eliminando las tablas si existen, para luego crearlas
if not objectproperty(object_id('A_Equipos'),'IsTable') is null
drop table A_Equipos
go
create table A_Equipos (Cod_Equipo char(25) not null , Cod_Empleado char(25) not null, Fecha_Asig datetime not null, Observaciones char(100))
go
alter table A_Equipos add constraint pk_Clave_A_Equipos primary key (Cod_Equipo, Fecha_Asig)
go
if not objectproperty(object_id('Hist_A_Equipos'),'IsTable') is null
drop table Hist_A_Equipos
go
create table Hist_A_Equipos (Cod_Equipo char(25) not null , Cod_Empleado char(25) not null, Fecha_Asig datetime not null, Observaciones char(100))
go
create index index_Hist_A_Equipos on Hist_A_Equipos (Cod_Equipo, Fecha_Asig)
go
--
create trigger trg_A_Equipos on A_Equipos for insert, delete
as
begin
insert Hist_A_Equipos
select Cod_Equipo,Cod_Empleado,Fecha_Asig,Observaciones from inserted
--ESTA ES LA PARTE QUE NO FUNCIONA!!!!!!!!!!!!!!!!1
DELETE * FROM A_Equipos where A_Equipos.Cod_Equipo = inserted.Cod_Equipo;
end
go

--Probando la Inserción
insert into A_Equipos values ('PZOPOS/N00', 'AMATA', '08/09/2004', 'SI

select * From A_Equipos
select * From Hist_A_Equipos
--AGRADEZCO SU VALIOSA AYUDA. GRACIAS
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:CODIGO FUENTE

Publicado por Isaías Islas (5072 intervenciones) el 09/09/2004 23:59:26
Amiga

He leido tu posta y el ERROR consiste en que estas haciendo trigger's RECURSIVOS, y eso, no es valido (por el momento).

¿Porque NO hacer la validación desde el STORE que hace la inserccion de ASIGNACION?

Primero, validar si esta ASIGNADO y de ser asi, pues ELIMINARLO PRIMERO.

IF EXISTS(SELECT Cod_Equipo FROM A_Equipos WHERE........)
DELETE Cod_Equipo FROM A_Equipos WHERE.........
-- Aqui se dispara tu TRIGGER de DELETE.

¿Me he explicado?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:CODIGO FUENTE

Publicado por Alejandra (6 intervenciones) el 10/09/2004 14:40:03
Si, te entiendo, pero es que no se la sintáxis para implementar el delete en el trigger, y además porque tengo que comparar el Cod_Equipo que estoy tratando de insertar con los registros de mi tabla, y no se como codificarlo??
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:CODIGO FUENTE

Publicado por Isaías Islas (5072 intervenciones) el 10/09/2004 16:56:43
Vamos por pasos, como te comente, debes VERIFICAR la existencia de tu registro en el STORE que hace la inserccion:

IF EXISTS(SELECT Cod_Equipo FROM A_Equipos WHERE........)
DELETE Cod_Equipo FROM A_Equipos WHERE.........

De existir, LO BORRAS, al momento de borrarlo, se disparara el trigger que deseas implementar, no lo quieras hacer TODO en un solo trigger.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:CODIGO FUENTE

Publicado por Alejandra (6 intervenciones) el 10/09/2004 18:09:34
Yo quiero que al insertar un registro, si está en la tabla lo sustituya, es decir que se borre el anterior y quede el nuevo. Entonces para ello, uso un trigger de inserción, que se activa una vez que yo inserte un registro, y si este existe, se ejecute un delete de ese registro anterior.

Mi código es este, pero no se como implementar el delete (yo conozco la sintáxis normal del delete, pero en éste caso voy a borrar un registro basándome en un dato que estoy insertando, y no sé como hacerlo):

create trigger trg_A_Equipos on A_Equipos
for insert
as
begin
--Insertando el nuevo registro en la tabla de históricos
insert Hist_A_Equipos
select Cod_Equipo,Cod_Empleado,Fecha_Asig,Observaciones from inserted

--ESTA ES LA PARTE QUE NO FUNCIONA!!!!!!!!!!!!!!!!
DELETE * FROM A_Equipos where A_Equipos.Cod_Equipo = inserted.Cod_Equipo;
end
go

/*Y también que no sé como hacer que el trigger se ejecute antes de que se efectúe propiamente la inserción. Por ello me da un error de Clave Primaria.*/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:CODIGO FUENTE

Publicado por Isaías Islas (5072 intervenciones) el 10/09/2004 22:10:14
Y yo te conteste que NO TODO LO PUEDES PROGRAMAR EN UN TRIGGER, que eso del "borrado", lo debes hacer mediante el STORE PROCEDURE que hace la insercción del registro.

El store cuando hace el DELETE, entonces se dispara el trigger que lo manda al historico.

Asi de simple.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar