106 lines
4.5 KiB
Transact-SQL
106 lines
4.5 KiB
Transact-SQL
/* =====================================================================
|
|
TRIGGER DE REPLICACION iptb00020 (Grupos / Clases)
|
|
marmotech.dbo.iptb00020 ---> exterior.dbo.iptb00020
|
|
|
|
Motivo:
|
|
Migracion a Genero 6.0. El programa ipprmt005 abria una segunda
|
|
conexion "IFMX" (= base EXTERIOR en la misma instancia SQL Server)
|
|
para replicar manualmente cada INSERT/UPDATE de iptb00020.
|
|
Con Genero 6.0 + ODBC Driver 18 ese segundo CONNECT falla con
|
|
el error -6366 ("Changed database context to 'marmotech'").
|
|
|
|
Se elimino del fuente ipprmt005.4gl toda la logica "SET CONNECTION IFMX"
|
|
y esa replicacion la asume ahora este trigger, del lado del servidor.
|
|
|
|
Cobertura:
|
|
- ipprmt005.4gl es el UNICO programa del ERP que escribe iptb00020
|
|
(los demas solo la consultan), asi que el trigger reemplaza por
|
|
completo la replicacion sin riesgo de escrituras duplicadas.
|
|
|
|
Comportamiento (identico al del programa original):
|
|
- INSERT -> crea la fila en EXTERIOR.
|
|
- UPDATE -> sincroniza la fila en EXTERIOR (cubre tanto "Modificar"
|
|
como el "borrado logico" status_t='E').
|
|
- Cross-database directo (misma instancia, sin linked server).
|
|
- NO se maneja DELETE fisico: el ERP nunca borra fisicamente esta
|
|
tabla, solo marca status_t = 'E'.
|
|
|
|
Ambiente: probar primero en DESARROLLO (.40.9) antes de PRODUCCION (.40.8).
|
|
===================================================================== */
|
|
|
|
/* ---------------------------------------------------------------------
|
|
PASO 0 (VERIFICACION - correr ANTES de crear el trigger)
|
|
Confirmar las columnas reales de EXTERIOR.dbo.iptb00020.
|
|
El esquema local (.sch) de ipdir esta viejo y NO lista 'instalacion',
|
|
pero el programa 3.20 si la escribia, por lo que deberia existir.
|
|
Si en el resultado NO aparece 'instalacion', elimine del trigger las
|
|
dos referencias a e.instalacion / i.instalacion antes de crearlo.
|
|
--------------------------------------------------------------------- */
|
|
-- SELECT c.name AS columna, t.name AS tipo, c.max_length, c.is_nullable
|
|
-- FROM exterior.sys.columns c
|
|
-- JOIN exterior.sys.types t ON t.user_type_id = c.user_type_id
|
|
-- WHERE c.object_id = OBJECT_ID('exterior.dbo.iptb00020')
|
|
-- ORDER BY c.column_id;
|
|
GO
|
|
|
|
USE marmotech;
|
|
GO
|
|
|
|
IF OBJECT_ID('dbo.trg_iptb00020_repl_exterior', 'TR') IS NOT NULL
|
|
DROP TRIGGER dbo.trg_iptb00020_repl_exterior;
|
|
GO
|
|
|
|
CREATE TRIGGER dbo.trg_iptb00020_repl_exterior
|
|
ON dbo.iptb00020
|
|
AFTER INSERT, UPDATE
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM inserted)
|
|
RETURN;
|
|
|
|
/* 1) Actualizar en EXTERIOR las filas que ya existen (por cod_n). */
|
|
UPDATE e
|
|
SET e.producto = i.producto,
|
|
e.status_t = i.status_t,
|
|
e.us_crea = i.us_crea,
|
|
e.fech_crea = i.fech_crea,
|
|
e.us_mod = i.us_mod,
|
|
e.fech_mod = i.fech_mod,
|
|
e.instalacion = i.instalacion
|
|
FROM exterior.dbo.iptb00020 e
|
|
INNER JOIN inserted i ON e.cod_n = i.cod_n;
|
|
|
|
/* 2) Insertar en EXTERIOR las filas que aun no existen. */
|
|
INSERT INTO exterior.dbo.iptb00020
|
|
(cod_n, producto, status_t, us_crea, fech_crea, us_mod, fech_mod, instalacion)
|
|
SELECT i.cod_n, i.producto, i.status_t, i.us_crea, i.fech_crea, i.us_mod, i.fech_mod, i.instalacion
|
|
FROM inserted i
|
|
WHERE NOT EXISTS (SELECT 1
|
|
FROM exterior.dbo.iptb00020 e
|
|
WHERE e.cod_n = i.cod_n);
|
|
END;
|
|
GO
|
|
|
|
/* ---------------------------------------------------------------------
|
|
ROLLBACK (si hiciera falta revertir):
|
|
USE marmotech;
|
|
DROP TRIGGER dbo.trg_iptb00020_repl_exterior;
|
|
|
|
PRUEBA rapida (en DESARROLLO):
|
|
-- alta
|
|
INSERT INTO marmotech.dbo.iptb00020 (cod_n,producto,us_crea,fech_crea,instalacion)
|
|
VALUES (999999,'PRUEBA TRG', SUSER_SNAME(), GETDATE(), 1);
|
|
SELECT * FROM exterior.dbo.iptb00020 WHERE cod_n = 999999; -- debe aparecer
|
|
-- modificacion
|
|
UPDATE marmotech.dbo.iptb00020 SET producto='PRUEBA TRG MOD' WHERE cod_n=999999;
|
|
SELECT producto FROM exterior.dbo.iptb00020 WHERE cod_n = 999999; -- debe reflejar
|
|
-- borrado logico
|
|
UPDATE marmotech.dbo.iptb00020 SET status_t='E' WHERE cod_n=999999;
|
|
SELECT status_t FROM exterior.dbo.iptb00020 WHERE cod_n = 999999; -- debe ser 'E'
|
|
-- limpieza
|
|
DELETE FROM marmotech.dbo.iptb00020 WHERE cod_n=999999;
|
|
DELETE FROM exterior.dbo.iptb00020 WHERE cod_n=999999;
|
|
--------------------------------------------------------------------- */
|