CREATE TRIGGER to monitor a specific table row - mysql

I have two tables & need to write a TRIGGER for this scenario.
1. Parameters_Table(int pkid, string param_name, string param_value)
2. Tokens_Table(int pkid,string item,string validity)
I have a requirement of deleting all entries in Tokens_Table if a particular row where param_name='Enterprise' in Parameters_Table changes its 'param_value'. The value is changed from UI. eg., row <7,enterprise,60> changes to <7,enterprise,25> in Parameters_Table then delete all entries from Tokens_Table.
How should I write the trigger. Please guide. (I need to write this for Informix Database, but mysql queries would also help)

DELIMITER $$
CREATE TRIGGER after_update AFTER UPDATE ON Parameters_Table
FOR EACH ROW
BEGIN
IF OLD.param_name ='Enterprise' THEN
IF NEW.param_value != OLD.param_value THEN
DELETE FROM Tokens_Table WHERE pkid = NEW.pkid;
END IF;
END IF;
END$$
Just try above code.Hope this will helps.

You can try the following syntax/format:
DELIMITER $$
CREATE TRIGGER delete_tokens AFTER INSERT ON Parameters_Table
FOR EACH ROW
BEGIN
IF NEW.param_name = 'enterprise' THEN
BEGIN
DELETE FROM Tokens_Table WHERE pkid = NEW.pkid;
END;
END IF;
END$$

Related

Error trigger insert into after insert

Hi guys I am trying to make some triggers to update in one table after insert in other table but it reports me an error. Two tables have the same fields and with the same name.
Here is the code.
DELIMITER //
CREATE TRIGGER Insertar_Bares_Private AFTER INSERT ON Bares
FOR EACH ROW
BEGIN
INSERT INTO Bares_Private (nombrebar, direccion) VALUES (new.nombrebar, new.direccion);
END//
CREATE TRIGGER Insertar_Categorias_Private AFTER INSERT ON Categorias
FOR EACH ROW
BEGIN
INSERT INTO Categorias_Private (nombrecategoria) VALUES (new.nombrecategoria);
END//
CREATE TRIGGER Insertar_Productos_Private AFTER INSERT ON Productos
FOR EACH ROW
BEGIN
INSERT INTO Productos_Private (nombreproducto, idcategoria, descripcion, precio, imagen) VALUES (new.nombreproducto, new.idcategoria, new.descripcion, new.precio, new.imagen);
END//
-- Triggers al actualizar
CREATE TRIGGER Actualizar_Usuarios_Private AFTER UPDATE on Usuarios
for each ROW
BEGIN
UPDATE Usuarios_Private
SET nombreusuario=new.nombreusuario, contrasenia=new.contrasenia, email=new.email, telefono=new.telefono
where idusuario=new.idusuario;
END//
CREATE TRIGGER Actualizar_Bares_Private AFTER UPDATE on Bares
for each ROW
BEGIN
UPDATE Bares_Private
SET nombrebar=new.nombrebar, direccion=new.direccion
where idbar=new.idbar;
END//
CREATE TRIGGER Actualizar_Categorias_Private AFTER UPDATE on Categorias
for each ROW
BEGIN
UPDATE Categorias_Private
SET nombrecategoria=new.nombrecategoria
where idcategoria=new.idcategoria;
END//
CREATE TRIGGER Actualizar_Productos_Private AFTER UPDATE on Productos
for each ROW
BEGIN
UPDATE Productos_Private
SET nombreproducto=new.nombreproducto, idcategoria=new.idcategoria, descripcion=new.descripcion, precio=new.precio, imagen=new.imagen
where idproducto=new.idproducto;
END//
DELIMITER ;
And here is the error reported.
#1235 - This version of MySQL doesn't yet support 'multiple triggers with the same action time and event for one table'
Thank you in advice.
Remove the ; from all the END; and apply the delimiter END// will solve your problem.
Since you already placed the proper ; for the INSERT/UPDATE statement, so no need to place it again in the END;.
You only need to change the delimiter before defining a trigger if the trigger contains more than one query. This is because you need to use the default delimiter ; in this case to separate the queries within the trigger, but the MySQL client will incorrectly think you mean to terminate the trigger definition here. This also requires you to use BEGIN ... END around the block of queries in the trigger.
DELIMITER //
CREATE TRIGGER Insertar_Usuarios_Private AFTER INSERT ON Usuarios
FOR EACH ROW
BEGIN
INSERT INTO Usuarios_Private (nombreusuario, contrasenia, email,telefono) VALUES (new.nombreusuario, new.contrasenia, new.email, new.telefono);
END//
CREATE TRIGGER Insertar_Bares_Private AFTER INSERT ON Bares
FOR EACH ROW
BEGIN
INSERT INTO Bares_Private (nombrebar, direccion) VALUES (new.nombrebar, new.direccion);
END//
-- and so on ...
DELIMITER ;
However, your triggers each only contain one query. Therefore you can dispense with the delimiter and the BEGIN ... END block entirely.
CREATE TRIGGER Insertar_Usuarios_Private AFTER INSERT ON Usuarios
FOR EACH ROW
INSERT INTO Usuarios_Private (nombreusuario, contrasenia, email,telefono) VALUES (new.nombreusuario, new.contrasenia, new.email, new.telefono);
CREATE TRIGGER Insertar_Bares_Private AFTER INSERT ON Bares
FOR EACH ROW
INSERT INTO Bares_Private (nombrebar, direccion) VALUES (new.nombrebar, new.direccion);
-- and so on ...

Problems creating TRIGGER in MySQL

I am first time using trigger concept in my MYSQL workbench like below query,
First I created people table by using below query,
CREATE TABLE people (age INT, name varchar(150));
Then I used below query for trigger
DELIMITER
CREATE TRIGGER agecheck BEFORE INSERT ON raptor1_5.people FOR EACH ROW IF NEW.age < 0 THEN SET NEW.age = 0; END IF;
DELIMITER ;
But agecheck trigger not creating to people table. Its does not show any error message when I run this query.
Here is my table images,
Updated : based on the answer
Try with this.
USE `raptor1_5`;
DELIMITER $$
DROP TRIGGER IF EXISTS raptor1_5.agecheck$$
USE `raptor1_5`$$
CREATE TRIGGER agecheck BEFORE INSERT ON people
FOR EACH ROW
BEGIN
IF NEW.age < 0 THEN
SET NEW.age = 0;
END IF;
END$$
DELIMITER ;
The standard trigger syntax should be as
DELIMITER //
CREATE TRIGGER agecheck BEFORE INSERT ON raptor1_5.people
FOR EACH ROW
BEGIN
IF NEW.age < 0 THEN
SET NEW.age = 0;
END IF;
END;//
DELIMITER ;
The above is when you run on mysql cli, however in phpmyadmin or workbench check if you have an option to set the delimiter if yes choose that and remove the delimiter part from the above.

MYSQL Trigger set datetime value using case statement

I'm using mysqlimport to do mass table inserts (replacing duplicates primary keys). Several tables have date time columns with records containing values '0000-00-00'. What I would like is a trigger which detects these '0000-00-00' values and replaces with '1950-01-01', otherwise keep the datetime value in the record (i.e. when it's not '0000-00-00').
I have tried the following:
CREATE TRIGGER set_datetime BEFORE INSERT ON tbl
FOR EACH ROW
CASE
WHEN date_col='0000-00-00' THEN SET date_col='1950-01-01';
END CASE
Thank you.
EDIT
Update attempt:
CREATE TRIGGER set_datetime BEFORE INSERT ON tbl
FOR EACH ROW
IF (NEW.date_col='0000-00-00') THEN
SET NEW.date_col='1950-01-01';
END IF;
Still getting an error in the SET portion.
EDIT 2
WORKING:
DELIMITER $$
CREATE TRIGGER insert_check BEFORE INSERT ON ar
FOR EACH ROW
BEGIN
IF NEW.delivery_date='0000-00-00' THEN
SET NEW.delivery_date='1950-01-01';
END IF;
END; $$
DELIMITER ;
Use IF THEN :
IF (NEW.date_col = '0000-00-00') THEN
SET NEW.date_col='1950-01-01';
END IF;
CREATE TRIGGER set_datetime BEFORE INSERT ON tbl
FOR EACH ROW
IF YEAR(NEW.date_col)=0 THEN
SET NEW.date_col='1950-01-01 00:00:00';
END IF;
Give it a Try !!!
If you want, or need, to use 'case' then this should work:
SET NEW.date_col=CASE WHEN NEW.date_col='0000-00-00' THEN ='1950-01-01'
WHEN NEW.date_col='something else' THEN 'whatever'
ELSE 'default'
END CASE;

Help with writing MySQL trigger

With the following tables:
Party.(PartyId, PartyTypeCode) and Member.(MemberId (FK), Name)
I want to fill in the MemberId column with the value of the PartyId after a new Party is created.
I know the SQL below is wrong but that is why I am looking for help in making it right.
CREATE TRIGGER tgr_member_create AFTER INSERT on Party
FOR EACH ROW BEGIN
IF NEW.PartyTypeCode = 'M' THEN
INSERT Member(MemberId)
VALUES('Party.PartyId')
END IF;
END;
Thanks to Nanne's input this is what works:
DELIMITER $$
CREATE TRIGGER tgr_member_create AFTER INSERT on Party
FOR EACH ROW BEGIN
IF NEW.PartyTypeCode = 'M' THEN
INSERT Member (MemberId,Name)
VALUES(NEW.PartyId, 'someName');
END IF;
END;$$
DELIMITER ;
Your values should call the NEW row, just as you do with the partytypecode I guess? I'm assuming
delimiter $$
CREATE TRIGGER tgr_member_create AFTER INSERT on Party
FOR EACH ROW BEGIN
IF NEW.PartyTypeCode = 'M' THEN
INSERT Member (MemberId,Name)
VALUES(NEW.PartyId, 'someName')
END IF;
END;$$
Pay attention to the delimiter code. Because you are using ; inside, you can't use it as a normal 'end-of-command' token. that's why the &&
For debugging:
Make sure the query works when you perform it outside a trigger:
INSERT Member (MemberId,Name)
VALUES(party-id goes here, 'someName')
There could be a small mistake there. Fill in your partyId obviously.
Try this
CREATE TRIGGER tgr_member_create AFTER INSERT on Party
FOR EACH ROW BEGIN
IF NEW.PartyTypeCode = 'M' THEN
INSERT Member(MemberId)
VALUES('New.PartyId')
END IF;
END;

I want to create more triggers on the same table

I have 2 tables that I want to be synchronized when insert, update or delete
can I create more than one trigger on the same table??
I already wrote code like that .. but it doesn't work .. but when I create only one trigger it works correctly.
the code is something like that:
CREATE TRIGGER photosinsert BEFORE INSERT ON photos
FOR EACH ROW BEGIN
INSERT INTO old_photo SET PhotoID = NEW.photo_id, photo_original = NEW.file_name
;
END;
delimiter |
CREATE TRIGGER photosupdate BEFORE UPDATE ON photos
FOR EACH ROW BEGIN
UPDATE old_photo SET photo_original = NEW.file_name
WHERE
PhotoID = NEW.photo_id
;
END;
delimiter |
CREATE TRIGGER photosdelete BEFORE DELETE ON photos
FOR EACH ROW BEGIN
DELETE FROM old_photo WHERE
PhotoID = OLD.photo_id
;
END;
is there a solution for that, please?
Put all code into single trigger.
You can use multiple statements between BEGIN and END