Trigger Syntax Error 1064, Using IF/THEN and Dates - mysql

Being a complete newbie to this, I thought I might be able to save my self a lot of headache by just asking for help...
When I try to run this I'm getting an Error 1064: You have an error in your SQL Syntax...
CREATE TRIGGER payroll_lock BEFORE DELETE OR INSERT OR
UPDATE ON timesheet_entry FOR EACH ROW IF entry_date < '2013-07-25'
THEN raise_application_error(-20001, 'Cannot modify old records.');
I would also consider other options for stopping the insert/update/delete if the record is before a given fixed date.
Thanks for any help in fixing this! And explanations are appreciated, I don't know much in this particular area.

you should CALL keyword before raise_application_error function.
another tip is you should use NEW or OLD keyword for update trigger.
I'm not sure but I don't think you can create multiple trigger at same command with OR(this is first time I see that).
DELIMITER //
CREATE TRIGGER payroll_lock BEFORE UPDATE ON wp_links
FOR EACH ROW
BEGIN
IF NEW.entry_date < '2013-07-25' THEN
CALL raise_application_error(-20001, 'Cannot modify old records.');
END IF;
END//

Related

MySQL 5.7 Create Trigger Syntax Error?

I've been trying to create a simple BEFORE INSERT trigger on a database table (MySQL v 5.7 ) but I keep receiving a vague "#1064 ... syntax error" message which doesn't help resolve the issue.
Here's the SQL:
CREATE OR REPLACE TRIGGER `CREATE_QUIZ_TRIG` BEFORE INSERT ON `quiz`
FOR EACH ROW BEGIN
SET NEW.ACTIVE = UPPER(NEW.ACTIVE);
SET NEW.CREATED = NOW();
END
/
All I'm trying to do is enforce a column to uppercase and then insert the current date & time into a timestamp column. I've been following the documentation from:
https://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html
and realise that for multi-statement expression I have to redefine the delimiter at the beginning of the trigger's creation but the same '#1064' error occurs.
This is made even more confusing because when I use phpmyadmin's interface for creating the same trigger it works fine - but won't when I export the generated SQL and try to create the trigger using that!?
Thanks for any help
I didn't realise that, by default, phpmyadmin adds a ; delimiter which was breaking the ; used to end a statement within the BEGIN END block.

MySQL trigger creation - missing semicolon

im new in SQL programming. I need to create a trigger which after delete on "czytelnik" will also delete all records from "wypożyczył" which have the same CzytelnikID.
My code:
create trigger zadanie10
after update on czytelnik
for each row begin
if(old.Nazwisko != new.Nazwisko) then
delete from wypożyczył
where CzytelnikID=old.CzytelnikID;
end if;
end;
I got no idea what is worng in this code. Getting error after
"old.CzytelnikID;"
"end if;"
"end;"
I bypassed my problem this way:
create trigger zadanie10
after update on czytelnik
for each row
delete from wypożyczył
where old.CzytelnikID=wypożyczył.CzytelnikID and old.Nazwisko!=new.Nazwisko;
But if anybody know why i couldnt do the first way, please tell me.

MYSQL trigger syntax - missing semicolon

I'm relatively new to MYSQL from an MS SQL background. Can someone please point out why I'm getting syntax errors here please? I'm sure I've done something very obviously wrong but I just can't see it:
I'm getting a missing semicolon syntax error on line 8:
CREATE TRIGGER trg_InsertProductWatchListPriceHistory
AFTER UPDATE
ON ProductWatchlist FOR EACH ROW
BEGIN
INSERT INTO ProductWatchListPriceHistory
(ProductWatchlistID,Price)
VALUES
(ProductWatchlistID,New.ProductPrice);
END;
Any help greatly appreciated.
You need to change your default delimiter to something else than ;. Otherwise your definition ends at the first ; which would make it incomplete.
delimiter |
CREATE TRIGGER trg_InsertProductWatchListPriceHistory
AFTER UPDATE
ON ProductWatchlist FOR EACH ROW
BEGIN
INSERT INTO ProductWatchListPriceHistory (ProductWatchlistID, Price)
VALUES (New.ProductWatchlistID, New.ProductPrice);
END
|
delimiter ;
Please check this bash script for generating the update trigger.
This script will require the database name and table names.
While using this script please update the username and password.
If using MySQL Workbench then Editor's create trigger under table design options should be used to avoid changing delimiters before and after.

MySQL AFTER INSERT Trigger - select INTO using NEW values not working

In MySQL:
I have an interview table, and
when a new interview is created (a row inserted into interview),
I want to add rows to a child table interview_questions table linking to the question definitions in interview_questions_template.
I'm trying to do this in an AFTER INSERT trigger on interview, and mysql is saying I have a syntax error at the end of my INSERT INTO ... SELECT statement.
I've tried joining with NEW, thinking it might be a table, but that didn't work either. Gander at the code?
CREATE TRIGGER interview_AFTER_INSERT AFTER INSERT ON interview
FOR EACH ROW
BEGIN
INSERT INTO interview_questions (id_interview, id_candidate, id_question_def, s_userid)
SELECT NEW.id_interview, NEW.id_candidate, interview_question_template.id_question_def, NEW.s_userid
FROM interview_question_template;
END
The error mysqlworkbench is showing is "missing 'semicolon'", underlining interview_question_template after the FROM.
The execution error says there is an error on that line after ' '.
You are doing fine. Just wrap the whole thing in a delimiter block. The below survives the 1064 Error.
DELIMITER $$
CREATE TRIGGER interview_AFTER_INSERT AFTER INSERT ON interview
FOR EACH ROW
BEGIN
INSERT INTO interview_questions (id_interview, id_candidate, id_question_def, s_userid)
SELECT NEW.id_interview, NEW.id_candidate, interview_question_template.id_question_def, NEW.s_userid
FROM interview_question_template;
END
$$
DELIMITER ;
As for the importance of Delimiters, see the bottom of This Post of mine. I wrote it more eloquently elsewhere, just can't find a reference to it. And the mysql manual has little about it with any verbosity for the average human.
I am sorry for posting the obvious. Sometimes people just have to see it :P
The other thing I did was to simply remove the BEGIN/END and it also worked like a charm.

Error in mysql syntax: Befor Update Trigger

I am setting up a master master replication and trying to do some tests by setting up a before update trigger.
I am getting an error when I run the code below
CREATE TRIGGER update_blogs
BEFORE UPDATE ON blogs
FOR EACH ROW
BEGIN
IF (NEW.updated_replication < OLD.updated_replication) THEN
SET NEW= OLD ;
END IF;
END$$
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near '' at
line 6
What I am trying to do is only allow the row to be updated if the new row has a greater updated_replication(timestamp) value.
I am using mysql.
Can any one please tell me where I am wrong. How can I debug such errors? Is this any kind of syntax error?
Two problems:
First problem: you can't SET NEW = OLD. You can only assign individual columns, not the whole row. So you could make sure the new value does not decrease:
IF (NEW.updated_replication < OLD.updated_replication) THEN
SET NEW.updated_replication = OLD.updated_replication;
END IF;
But that will set one column and let any other columns change according to the UPDATE that spawned this trigger. That might leave you with data that doesn't agree with itself.
If you want the whole row to revert to the old column values, you'd have to write a series of assignments in the SET statement, one for each column of the row.
If you instead want to abort the whole update, then you need to learn the SIGNAL feature.
IF (NEW.updated_replication < OLD.updated_replication) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'You can\'t travel backwards in time!';
END IF;
This doesn't roll back the transaction, just the single UPDATE that spawned the trigger. Any other changes made in the same transaction are still pending.
Second problem: you haven't set the DELIMITER when defining a trigger with a compound statement. See my answer here: Create function through MySQLdb
I don't think assignment of a database record with tableA = tableB is legal which is essentially what NEW=OLD is doing.
It would be better to do some other operation if the update is not desired:
CREATE TRIGGER update_blogs
BEFORE UPDATE ON blogs
FOR EACH ROW
BEGIN
IF (NEW.updated_replication >= OLD.updated_replication) THEN
SET NEW.invalid = True;
END IF;
END;$$
Where invalid is a column added just for this purpose. A periodically run stored procedure could then deal with such records, perhaps by deleting them.