Problemas con Trigger
Publicado por PilarRiusHS5j
Hola, buenas tardes, solicito su ayuda con un problema de Trigger.
Necesito crear un Trigger, AFTER INSET.
Estoy utilizando SQL Server, ver 19.3
Después de ingresar registros a la tabla xproducto, se beberán de guardar en la tabla xregistro_producto. En el campo INSERTADO, hay que guardar la fecha en que se ingresan los registros, por eso utilizo GETDATE.
1. El código que estoy utilizando es el siguiente.
Y me sale este error.
No sé por dónde buscar, ya he hecho muchas modificaciones y nada…
Necesito crear un Trigger, AFTER INSET.
Estoy utilizando SQL Server, ver 19.3
Después de ingresar registros a la tabla xproducto, se beberán de guardar en la tabla xregistro_producto. En el campo INSERTADO, hay que guardar la fecha en que se ingresan los registros, por eso utilizo GETDATE.
1. El código que estoy utilizando es el siguiente.
Y me sale este error.
No sé por dónde buscar, ya he hecho muchas modificaciones y nada…
1. He encontrado que, para el SQL Server, hay que utilizar también…
Revisando muchos videos encuentro que para SQL SERVER hay que utilizar AS y un From inserted, entonces tampoco me funciona; el error que me manda es de paréntesis.
Sinceramente ya no sé por dónde buscar.
Muchas gracias de antemano.
Revisando muchos videos encuentro que para SQL SERVER hay que utilizar AS y un From inserted, entonces tampoco me funciona; el error que me manda es de paréntesis.
Sinceramente ya no sé por dónde buscar.
Muchas gracias de antemano.
Pilar 😎
Respuestas
JOSECABALLERO1IV
respondió hace 5 months ago:
Hola Pilar.
Te comparto un ejemplo del uso del Trigger.
¨¨ Nota solo aplica para una sola tabla.
USE AdventureWorks2022;
GO
IF OBJECT_ID ('Purchasing.LowCredit','TR') IS NOT NULL
DROP TRIGGER Purchasing.LowCredit;
GO
-- This trigger prevents a row from being inserted in the Purchasing.PurchaseOrderHeader table
-- when the credit rating of the specified vendor is set to 5 (below average).
CREATE TRIGGER Purchasing.LowCredit ON Purchasing.PurchaseOrderHeader
AFTER INSERT
AS
IF (ROWCOUNT_BIG() = 0)
RETURN;
IF EXISTS (SELECT 1
FROM inserted AS i
JOIN Purchasing.Vendor AS v
ON v.BusinessEntityID = i.VendorID
WHERE v.CreditRating = 5
)
BEGIN
RAISERROR ('A vendor''s credit rating is too low to accept new
purchase orders.', 16, 1);
ROLLBACK TRANSACTION;
RETURN
END;
GO
-- This statement attempts to insert a row into the PurchaseOrderHeader table
-- for a vendor that has a below average credit rating.
-- The AFTER INSERT trigger is fired and the INSERT transaction is rolled back.
INSERT INTO Purchasing.PurchaseOrderHeader (RevisionNumber, Status, EmployeeID,
VendorID, ShipMethodID, OrderDate, ShipDate, SubTotal, TaxAmt, Freight)
VALUES (
2
,3
,261
,1652
,4
,GETDATE()
,GETDATE()
,44594.55
,3567.564
,1114.8638 );
GO
Te comparto un ejemplo del uso del Trigger.
¨¨ Nota solo aplica para una sola tabla.
USE AdventureWorks2022;
GO
IF OBJECT_ID ('Purchasing.LowCredit','TR') IS NOT NULL
DROP TRIGGER Purchasing.LowCredit;
GO
-- This trigger prevents a row from being inserted in the Purchasing.PurchaseOrderHeader table
-- when the credit rating of the specified vendor is set to 5 (below average).
CREATE TRIGGER Purchasing.LowCredit ON Purchasing.PurchaseOrderHeader
AFTER INSERT
AS
IF (ROWCOUNT_BIG() = 0)
RETURN;
IF EXISTS (SELECT 1
FROM inserted AS i
JOIN Purchasing.Vendor AS v
ON v.BusinessEntityID = i.VendorID
WHERE v.CreditRating = 5
)
BEGIN
RAISERROR ('A vendor''s credit rating is too low to accept new
purchase orders.', 16, 1);
ROLLBACK TRANSACTION;
RETURN
END;
GO
-- This statement attempts to insert a row into the PurchaseOrderHeader table
-- for a vendor that has a below average credit rating.
-- The AFTER INSERT trigger is fired and the INSERT transaction is rolled back.
INSERT INTO Purchasing.PurchaseOrderHeader (RevisionNumber, Status, EmployeeID,
VendorID, ShipMethodID, OrderDate, ShipDate, SubTotal, TaxAmt, Freight)
VALUES (
2
,3
,261
,1652
,4
,GETDATE()
,GETDATE()
,44594.55
,3567.564
,1114.8638 );
GO
PilarRiusHS5j
respondió hace 5 months ago:
Si alguien más me echa una mano, necesito guardar información en la Tabla 2, en cuanto se ingresen los datos en la Tabla 1.
Gracias de antemano.
Saludos
Gracias de antemano.
Saludos
JOSECABALLERO1IV
respondió hace 5 months ago:
Este ejemplo ya esta probado para que tengas un idea más puntual como aplicarlo a tus requerimientos.
------ Crear la tabla xproducto y la tabla xregistro_producto si no existen:
CREATE TABLE xproducto (
id_producto INT PRIMARY KEY,
seccio NVARCHAR(100),
nombre_producto NVARCHAR(100),
precio DECIMAL(10, 2),
fecha_recibido DATE,
importado BIT,
pais_origen NVARCHAR(100)
);
CREATE TABLE xregistro_producto (
id_producto INT,
nombre_producto NVARCHAR(100),
precio DECIMAL(10, 2),
INSERTADO DATETIME
);
------ Crear el trigger:
CREATE TRIGGER trg_after_insert_xproducto
ON xproducto
AFTER INSERT
AS
BEGIN
-- Insertar registros en la tabla xregistro_producto
INSERT INTO xregistro_producto (id_producto, nombre_producto, precio, INSERTADO)
SELECT
id_producto,
nombre_producto,
precio,
GETDATE() -- Obtiene la fecha y hora actual
FROM inserted;
END;
------
------ Crear la tabla xproducto y la tabla xregistro_producto si no existen:
CREATE TABLE xproducto (
id_producto INT PRIMARY KEY,
seccio NVARCHAR(100),
nombre_producto NVARCHAR(100),
precio DECIMAL(10, 2),
fecha_recibido DATE,
importado BIT,
pais_origen NVARCHAR(100)
);
CREATE TABLE xregistro_producto (
id_producto INT,
nombre_producto NVARCHAR(100),
precio DECIMAL(10, 2),
INSERTADO DATETIME
);
------ Crear el trigger:
CREATE TRIGGER trg_after_insert_xproducto
ON xproducto
AFTER INSERT
AS
BEGIN
-- Insertar registros en la tabla xregistro_producto
INSERT INTO xregistro_producto (id_producto, nombre_producto, precio, INSERTADO)
SELECT
id_producto,
nombre_producto,
precio,
GETDATE() -- Obtiene la fecha y hora actual
FROM inserted;
END;
------
Explicación general:
- CREATE TRIGGER trg_after_insert_xproducto ON xproducto AFTER INSERT: Crea un trigger llamado trg_after_insert_xproducto que se ejecuta después de que se inserten registros en la tabla xproducto.
- BEGIN ... END: El bloque de código que se ejecuta cuando se activa el trigger.
- INSERT INTO xregistro_producto ... SELECT ... FROM inserted; Inserta los datos en la tabla xregistro_producto seleccionando los valores de la tabla inserted. La tabla inserted es una tabla especial que contiene las filas que se acaban de insertar en xproducto.
- GETDATE(): Función que devuelve la fecha y hora actual, que se usa para rellenar el campo INSERTADO.
Uso del Trigger:
Cada vez que se inserte un registro en la tabla xproducto, este trigger se activará automáticamente y copiará los datos correspondientes a la tabla xregistro_producto, junto con la fecha y hora de inserción.
Por ejemplo, si insertas un registro en xproducto como este:
--- se insertan los datos.
INSERT INTO xproducto (id_producto, seccio, nombre_producto, precio, fecha_recibido, importado, pais_origen)
VALUES (1, 'A', 'Producto 1', 100.00, '2024-06-14', 0, 'Perú');
---- se consulta:
SELECT * FROM xregistro_producto;
Resultado obtenido
id_producto nombre_producto precio INSERTADO
1 | Producto 1 | 100.00 | 2024-06-14 12:34:56.789
--- se insertan los datos.
INSERT INTO xproducto (id_producto, seccio, nombre_producto, precio, fecha_recibido, importado, pais_origen)
VALUES (1, 'A', 'Producto 1', 100.00, '2024-06-14', 0, 'Perú');
---- se consulta:
SELECT * FROM xregistro_producto;
Resultado obtenido
id_producto nombre_producto precio INSERTADO
1 | Producto 1 | 100.00 | 2024-06-14 12:34:56.789
EXITO