How to use multiple events in one sql trigger? - mysql

This is my code at the moment:
DROP TRIGGER `backup`;
DELIMITER $$
CREATE TRIGGER `backup` AFTER INSERT UPDATE DELETE
ON `warehouse`
FOR EACH ROW
BEGIN
END$$
DELIMITER ;
This is the error I keep getting:
I checked my version of MariaDB. It's 10.1.21
It works if I use only one event, but with two or three it throws this error.
Insert Update trigger how to determine if insert or update

In MySQL or MariaDB, each trigger must be defined for exactly one event. You cannot define a trigger that will work for multiple events.
https://dev.mysql.com/doc/refman/5.7/en/create-trigger.html has the syntax:
trigger_event: { INSERT | UPDATE | DELETE }
This syntax notation means the event must be one of the three values INSERT, UPDATE, or DELETE.
Another clue is found if we DESCRIBE INFORMATION_SCHEMA.TRIGGERS:
EVENT_MANIPULATION enum('INSERT','UPDATE','DELETE')
The event type is an enum which means it can only have one value, not multiple.
The example you linked to is for Microsoft SQL Server, not MySQL or MariaDB.
Despite the fact that both "Microsoft" and "MySQL" start with a similar syllable, these are two different products, with different features.

Related

How to Identify MySQL Trigger Operation

In Oracle, when writing a unique trigger that handles INSERT, UPDATE OR DELETE operations, when can detect which operation is being executed using this technique, called 'Conditional Predicates'
create trigger sample_trigger
before insert or update
on sample_table
for each row
begin
case
when inserting then
--do something
when updating then
--do something
end case;
end;
Does MySQL 5.6 provides any technique that allows me to do the same? I wouldn't like to write three distinct triggers only to differentiate which operating is being executed. Thanks!
No. In MySQL (even in 8.0) triggers can only be called for one type of operation, INSERT, UPDATE or DELETE. From the manual, the syntax for CREATE TRIGGER is:
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name
trigger_time trigger_event
...
and trigger_event may only be one of INSERT, UPDATE or DELETE:
trigger_event: { INSERT | UPDATE | DELETE }
So given that there is no scope to call a trigger for different operations, there is no need to have the conditional predicates you describe.
What you could do instead in put your trigger code into a stored procedure, and then call that with a parameter which specifies whether the type of operation e.g. for an INSERT trigger you might use
CREATE TRIGGER db_insert
BEFORE INSERT ON db
FOR EACH ROW
BEGIN
CALL db_trigger_proc('INSERT');
END
Unfortunately you can't.
You can see that the documentation states that you can use only one event to fire the trigger.
Syntax:
trigger_event: { INSERT | UPDATE | DELETE }
that means you can choose only one event as a trigger_event.
another argument on the same doc :
There cannot be multiple triggers for a given table that have the same trigger event and action time. For example, you cannot have two BEFORE UPDATE triggers for a table. But you can have a BEFORE UPDATE and a BEFORE INSERT trigger, or a BEFORE UPDATE and an AFTER UPDATE trigger.

How can I create multiple BEFORE INSERT triggers?

I'm trying to learn mysql more in depth with relationships, triggers and what not. I currently have these 2 triggers for my database:
I'm trying to add another one that will BEFORE INSERT a different table
But I keep getting this error:
I'm not sure how I can get around this, or if this is specific to Sequel Pro (The GUI I'm using), it seems to wrap the query internally so I only have to enter the basic stuff, is there any way I can get this to work? My schema is like:
Forum_Threads has many Forum_Posts
Forum_Posts has many Posts_Replies
Forum_Threads and Forum_Posts both have a reply counter, so I'm trying to increment / decrement the reply_count on both tables when I'm inserting or deleting replies. Thanks.
The issue is that the GUI is trying to do a create trigger on a table that already has a before insert type trigger. Check your "Forum_threads" table to see if there's a BEFORE UPDATE trigger already on it.
Prior to MySQL 5.7.2,
There cannot be multiple triggers for a given table that have the same
trigger event and action time. For example, you cannot have two BEFORE
UPDATE triggers for a table. But you can have a BEFORE UPDATE and a
BEFORE INSERT trigger, or a BEFORE UPDATE and an AFTER UPDATE trigger.
(see 13.1.19 CREATE TRIGGER Syntax from the 5.6 manual.)
You can, however, specify multiple actions within the body of a given trigger, although the one-trigger-per-event limit can make managing trigger actions inconvenient.
it is not possible to 'create' multiple BEFORE INSERT triggers, but a possible workaround for you would be setting a behavior for each type of event.
Something like this may help you:
DROP TRIGGER IF EXISTS `<your_trigger>`;
DELIMITER //
CREATE TRIGGER `<your_trigger>` BEFORE INSERT ON `<your_table>`
FOR EACH ROW BEGIN
CASE <your_identifier>
WHEN <first_type> THEN
/*
ACTION BLOCK
FOR THIS EVENT
*/
WHEN <second_type> THEN
/*
ACTION BLOCK
FOR THIS EVENT
*/
ELSE
/*
ACTION BLOCK
FOR THIS EVENT
*/
END;
END//
DELIMITER ;
You can add as many event type as you needed, by doing this you can create a trigger that has multiple action based on a given event type identifier.
I hope this can help you, cheers!

How to create a trigger for before/after delete with update/insert in mysql?

I have two tables like as:
fee_master(id,cTId,feeType,amount,startDate,lastDate,fine_last_date,fine,status)
payroll(id,emId,date,loan,netSalary)
I am trying to create a trigger like as:
DELIMITER $$
DROP TRIGGER IF EXISTS test
DELIMITER $$;
CREATE TRIGGER test
BEFORE DELETE ON fee_master
FOR EACH ROW
UPDATE payroll SET loan=OLD.amount,netSalary=OLD.fine WHERE id=18;
DELIMITER $$;
delete from fee_master where id='18';
When I have run this trigger, the data is deleted from fee_master, but payroll is not updated, also I have tried to insert payroll but not working.Every times the data is deleted from fee_master.
If I change the update and delete query position with trigger then It is ok. Actually, It is not working on trigger operation.
What is the problem ?
Your syntax for UPDATE is incorrect. Multiple assignments are separated by ,, not AND.
UPDATE payroll SET loan=OLD.amount, netSalary=OLD.fine WHERE id=18;
May be you are new on triggering.
According to your question, I recommend you first read basics of triggering from here http://www.sitepoint.com/how-to-create-mysql-triggers/
Remind that, It is a stored process. You do not need to run the trigger every times,I hope you are confuse here. After creating a trigger, You have to run the master query then the trigger automatically run the next operation.
Your code is ok. And the code of Barmar also ok.The main problem your understanding.

Can I define multiple events in one Trigger declaration in mysql?

Here is my requirement,
I have a mysql table on which any change (insert/delete/update) should be handled in exactly same way. According to mysql documentation create trigger syntax is as follows:
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name
trigger_time **trigger_event**
ON tbl_name FOR EACH ROW
trigger_body
When I'm trying to put more than one event, its throwing syntax error.
One solution is I can write one procedure and 3 triggers (one for each event) and call the same procedure from all the triggers.
Is there any sophisticated solution for this ??
No. In MySQL, a trigger is for a single trigger_event. A trigger has to be either BEFORE or AFTER and one of INSERT, UPDATE, DELETE.
If we have lots of logic that is shared across the trigger events (logic that would need to be duplicated in multiple triggers), we can write/create a PROCEDURE to encapsulate that logic, and call that procedure from the body of multiple triggers.

how to create trigger on any change in table

I have a mysql table which on any change (i.e. insert, update and delete) I need to run the relevant trigger code.
Do I need to create three different triggers or is there a syntax for just one.
Using mysql 5.1
Three triggers may perform better and AFAIK - there is no possibility to create multi-action trigger in MySQL, but I hope the syntax for one trigger is:
CREATE TRIGGER Name AFTER INSERT ON Table
FOR EACH ROW
begin
...
END