how to use trigger for restricting modification - mysql

I have used this trigger to restrict the insertion of those records for which the date of birth is less then 18. This is working fine for the new insertion, but I also want to restrict the modification of the date of birth if it is set to less then 18. Please tell how can I do this?
DELIMITER $$
CREATE TRIGGER `test_candidate_before_insert` BEFORE INSERT ON `candidate` FOR EACH ROW
BEGIN
IF
DATEDIFF(CURDATE(), NEW.date_of_birth)/365 < 18
THEN
SIGNAL SQLSTATE '12345';
END IF;
END$$
DELIMITER ;

You need to define a separate UPDATE trigger.

MySQL, unfortunately, can't create trigger "before insert or update" like other common RDBMSs.
Just create another trigger for updating:
DELIMITER $$
CREATE TRIGGER `test_candidate_before_update` BEFORE UPDATE ON `candidate` FOR EACH ROW
BEGIN
IF
DATEDIFF(CURDATE(), NEW.date_of_birth)/365 < 18
THEN
SIGNAL SQLSTATE '12345';
END IF;
END$$
DELIMITER ;

Related

MySQL Trigger Is Not Inserting Date/Time String Into Column

Here's my trigger. Updating a row in event does not set a date/time string in sf_timestamp. New to triggers so I am not sure how to debug.
DELIMITER $$
CREATE DEFINER = `root`#`localhost` TRIGGER `event_stamp`
BEFORE UPDATE ON `event`
FOR EACH ROW
BEGIN
SET NEW.sf_timestamp = DATE_FORMAT(NOW(),'%Y-%m-%d %T');
END;;
DELIMITER $$
Suggestions?
When you define a DELIMITER, you need to keep that same delimiter until you are done with the block you are trying to declare. In this case, you are trying to create a new trigger and you need MySQL to interpret the whole block with multiple lines as one and ending them with the default ;
But when you are done, you have to END the block with the DELIMITER you have set earlier as following:
DELIMITER $$
CREATE DEFINER = `root`#`localhost` TRIGGER `event_stamp`
BEFORE UPDATE ON `event`
FOR EACH ROW
BEGIN
SET NEW.sf_timestamp = DATE_FORMAT(NOW(),'%Y-%m-%d %T');
END$$
DELIMITER ;
Unless your update statement includes a value for sf_timestamp, that field likely doesn't have a value to be formatted. If you are attempting to update the timestamp to represent the time when the record is updated, why not just use the current time?
DELIMITER $$
CREATE DEFINER = `root`#`localhost` TRIGGER `event_stamp` BEFORE UPDATE ON `event`
FOR EACH ROW
BEGIN
SET NEW.sf_timestamp = now();
END;;
DELIMITER $$
DELIMITER $$
CREATE DEFINER = `root`#`localhost` TRIGGER `event_stamp`
BEFORE UPDATE ON `event`
FOR EACH ROW
BEGIN
SET NEW.sf_timestamp = DATE_FORMAT(NOW(),'%Y-%m-%d %T');
END$$
DELIMITER ;
Followed #pensums suggestion and this worked for me

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.

get previous field value in trigger mysql

I have a trigger like this in MySQL:
DELIMITER $$
CREATE TRIGGER service_before_update BEFORE UPDATE ON service
FOR EACH ROW
BEGIN
IF NEW.seatCount < (?) THEN
SIGNAL SQLSTATE '12345';
END IF;
END$$
DELIMITER ;
instead of (?) I want previous value of "seatCount" is there any easy way or I should use something like this(ServiceNo is a PRI key):
(SELECT seatCount FROM service WHERE serviceNo = NEW.serviceNo LIMIT 1)
Yeah, it's super easy. OLD.seatCount should do what you want. http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html has more information.

mysql trigger not working?

I am trying to create a trigger to insert a new row conditionally based on an insert on another table...I can't seem to nail the syntax.
Here is what I have thus far:
DELIMETER $$
CREATE TRIGGER overPricedCar
AFTER INSERT ON cars
FOR EACH ROW
BEGIN
IF (new.sellPrice > '80000' )THEN
INSERT INTO listings VALUES(new.carName,'GOLD','0',' ');
END IF;
END$$
DELIMETER ;
For some reason I keep getting an error, they syntax seems to be OK, I'm not sure where I may have gone wrong.
EDIT
After correcting the typo, the trigger 'works'.
I have added a comment to be output when the trigger happens.
I have tested it, and the output message gets printed to the screen but the trigger does not actually complete the inserts:
DELIMITER $$
CREATE TRIGGER overPricedCar
BEFORE INSERT ON cars
FOR EACH ROW
BEGIN
IF (new.sellPrice > '80000' )THEN
INSERT INTO listings VALUES(new.carName,'GOLD','0',' ');
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "New Gold car!"; // this line throws it off
END IF;
END$$
DELIMITER ;
Where can I place the messages I want to be printed to the screen when this trigger runs?
Typo:
DELIMETER
^--- should be an I: DELIMITER

Prevent a record form being deleted or updated via the use of a Mysql trigger

I am using Mysql and trying to create a trigger on a table that prevents a specific record from being deleted or updated, example I have a table demo
id username password
1 dames t312llok
2 sauce 12ff1fff1
3 hynes 5656166oo9
I would like to prevent the record:
id username password
1 dames t312llok
from being deleted or updated via the use of a trigger
If you are using MySQL 5.5 or higher, this is simple.
DELIMITER $$
DROP TRIGGER IF EXISTS demo_bd $$
CREATE TRIGGER demo_bd BEFORE DELETE ON demo FOR EACH ROW
BEGIN
IF OLD.id = 1 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'This magical user cannot be deleted';
END IF;
END $$
DELIMITER ;
For the update, it's exactly the same code, with minor tweaks.
DELIMITER $$
DROP TRIGGER IF EXISTS demo_bu $$
CREATE TRIGGER demo_bu BEFORE UPDATE ON demo FOR EACH ROW
BEGIN
IF OLD.id = 1 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'This magical user cannot be updated';
END IF;
END $$
DELIMITER ;
Also... don't store passwords in the database.