Usar trigger para actualizar otra tabla

jose arriagada
02 de Abril del 2004
Tengo las siguientes tabla

Guias_Despacho
Numero_GD Numeric
Codigo_Cliente Numeric
Fecha_GD Datetime

Detalle_Guias_Despacho
Numero_GD Numeric
Numero_OT Numeric
Codigo_Articulo Numeric
Unidades_Despachadas Numeric
Kilos_Despachados Numeric

Detalle_OT
Numero_OT Numeric
Codigo_Articulo Numeric
Unidades_Recibidas Numeric
Kilos_Recibidos Numeric
Unidades_Despachadas Numeric
Kilos_Despachados Numeric

Y la situacion es la siguiente:

Una orden de trabajo (OT) tiene registrada los articulos, cantidades y kilos recibidos.
Cuando se hace un despacho, en la tabla Detalle_Guias_Despacho, registro el articulo, los kilos y unidades a despachar.
En ese momento, existe un trigger asociado a la Detalle_Guias_Despacho que actualiza los campos Unidades_Despachas y Kilos_Despachados.
Hasta aqui todo funciona bien. Sin problemas.

La cosa se complica cuando, deseo eliminar una Guia de despacho.
El trigger, inicialmente lo asocie a la tabla Detalle_Guias_Despacho, suponiendo que, al eliminar un registro de esta tabla, se actualizara la tabla Detalle_OT, pero lo que hace el trigger, es solo actualizar el ultimo registro eliminado.
Elimine el trigger, y lo instale a la tabla Guias_Despacho, pero tengo el siguiente problema.

NO SE COMO RECORRER TODOS LOS REGISTROS DE LA TABLA Detalle_Guias_Despacho PARA ACTUALIZAR LA TABLA Detalle_OT

Alguien sabe como realizar actualizaciones desde un trigger a otra tabla.

Muchas gracias por la atencion, y posible ayuda.

Isa?
02 de Abril del 2004
¿En SQL Server?

Un ejemplo en la base de PUBS

USE pubs
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'employeeData')
DROP TABLE employeeData
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'auditEmployeeData')
DROP TABLE auditEmployeeData
GO
CREATE TABLE employeeData (
emp_id int NOT NULL,
emp_bankAccountNumber char (10) NOT NULL,
emp_salary int NOT NULL,
emp_SSN char (11) NOT NULL,
emp_lname nchar (32) NOT NULL,
emp_fname nchar (32) NOT NULL,
emp_manager int NOT NULL
)
GO
CREATE TABLE auditEmployeeData (
audit_log_id uniqueidentifier DEFAULT NEWID(),
audit_log_type char (3) NOT NULL,
audit_emp_id int NOT NULL,
audit_emp_bankAccountNumber char (10) NULL,
audit_emp_salary int NULL,
audit_emp_SSN char (11) NULL,
audit_user sysname DEFAULT SUSER_SNAME(),
audit_changed datetime DEFAULT GETDATE()
)
GO
CREATE TRIGGER updEmployeeData
ON employeeData
FOR update AS
/*Check whether columns 2, 3 or 4 has been updated. If any or all of columns 2, 3 or 4 have been changed, create an audit record. The bitmask is: power(2,(2-1))+power(2,(3-1))+power(2,(4-1)) = 14. To check if all columns 2, 3, and 4 are updated, use = 14 in place of >0 (below).*/

IF (COLUMNS_UPDATED() & 14) > 0
/*Use IF (COLUMNS_UPDATED() & 14) = 14 to see if all of columns 2, 3, and 4 are updated.*/
BEGIN
-- Audit OLD record.
INSERT INTO auditEmployeeData
(audit_log_type,
audit_emp_id,
audit_emp_bankAccountNumber,
audit_emp_salary,
audit_emp_SSN)
SELECT 'OLD',
del.emp_id,
del.emp_bankAccountNumber,
del.emp_salary,
del.emp_SSN
FROM deleted del

-- Audit NEW record.
INSERT INTO auditEmployeeData
(audit_log_type,
audit_emp_id,
audit_emp_bankAccountNumber,
audit_emp_salary,
audit_emp_SSN)
SELECT 'NEW',
ins.emp_id,
ins.emp_bankAccountNumber,
ins.emp_salary,
ins.emp_SSN
FROM inserted ins
END
GO

/*Inserting a new employee does not cause the UPDATE trigger to fire.*/
INSERT INTO employeeData
VALUES ( 101, 'USA-987-01', 23000, 'R-M53550M', N'Mendel', N'Roland', 32)
GO

/*Updating the employee record for employee number 101 to change the salary to 51000 causes the UPDATE trigger to fire and an audit trail to be produced.*/

UPDATE employeeData
SET emp_salary = 51000
WHERE emp_id = 101
GO
SELECT * FROM auditEmployeeData
GO

/*Updating the employee record for employee number 101 to change both the bank account number and social security number (SSN) causes the UPDATE trigger to fire and an audit trail to be produced.*/

UPDATE employeeData
SET emp_bankAccountNumber = '133146A0', emp_SSN = 'R-M53550M'
WHERE emp_id = 101
GO
SELECT * FROM auditEmployeeData
GO