How to create a Trigger in a google cloud sql instance Database - mysql

I'm with a problem during creationg of a trigger in my database.
I've a MySQL Second Generation instance with a database (name: test) in my google cloud sql.
Right now i have multiple tables in my database and im trying to create a trigger in one of that tables using:
CREATE TRIGGER date_overlap_insert_start_date
BEFORE INSERT ON driver_operation
FOR EACH ROW
BEGIN
if exists(
select 1
from driver_operation
where nif = NEW.nif
and (NEW.start_date > start_Date and NEW.start_date < end_Date)) then
signal sqlstate '45000' SET MESSAGE_TEXT = 'Overlaps with existing data';
end if;
END;
The error i get is this:
Error Code: 1064. 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 10
Is there anyone who can help me on this? This trigger is to prevent overlap in date fields.

With respect to Google Cloud Platform, an important thing to do is to go to your instance configuration, ie "Edit Configuration" then go to "Flags" and ensure that "log_bin_trust_function_creators" is set to on. This will solve issues in GCP making triggers, as well as allow you to create triggers in MySQL Workbench CE 8.0 without it crashing.

I had this exact same issue today. It is simply due the cloud sql instance viewing each semi colon as the end of a statement, so I can only assume it tries to execute each time it encounters one.
Try creating your trigger with:
/*!50003 CREATE*/ /*!50003 TRIGGER date_overlap_insert_start_date
BEFORE INSERT ON driver_operation
FOR EACH ROW
BEGIN
if exists(
select 1
from driver_operation
where nif = NEW.nif
and (NEW.start_date > start_Date and NEW.start_date < end_Date))
then
signal sqlstate '45000' SET MESSAGE_TEXT = 'Overlaps with
existing data';
end if;
END */
edited to fix my syntax. Was missing a semi-colon.

Related

Unable to create a trigger in mysql hosted on amazon cloud

When am trying to create a simple trigger in mysql, am encountering the below error message. Please suggest me how to overcome this.
delimiter $$
create trigger trg_addresses_ins before insert on addresses
for each row
begin
declare msg varchar(128);
if length(new.addressstate) > 2 then
set msg = concat('MyTriggerError: Trying to insert a state value of more than 2 character: ', new.addressstate);
signal sqlstate '45000' set message_text = msg;
end if;
end$$
delimiter ;
`
Error Code: 1419. You do not have the SUPER privilege and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators variable) 0.078 sec
Super user is enabled but still get the same error and also am unable to change database parameter group associated with mysql aws db instance to 1. I am unable to modify db instance to select newly created group as the parameter group field is read only.
Appreciate your valuable inputs.
Thanks!
I guess you are using the default DB parameter group which you can not modify, the solution is you need to create your own parameter group, and set log_bin_trust_function_creators = 1, and apply your own parameter group to your current instance.

MySQL trigger #1064 syntax error

I have a database already in use on a server (MySQL Community Server 5.5.40-cll) & I'm trying to add a trigger to it but I keep getting the below error.
#1064 - 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 3
I'm trying to set a trigger to make sure that end_date is not before start_date, here's what I'm currently using.
CREATE TRIGGER `Meets insert` BEFORE INSERT ON `meets`
FOR EACH ROW
IF DATEDIFF(NEW.end_date, NEW.start_date) < 0 THEN
signal sqlstate '45000' set message_text = 'start_date must be before end_date';
END IF;
I've had a look in the MySQL documentation for 5.5 and it seems like everything I'm doing is supported by this version and I'm using it correctly.
I'm sure the if statement is correct as I asked another similar question earlier here on Stack Overflow about a separate problem I was having which worked fine. Although that was on a local development database where as this is on a server.
If anyone can spot what I'm doing wrong or has an idea of what to check it will be appreciated.
Thought I'd point out the server I'm making this change on isn't a production one.
It appears to only be a lack of a DELIMTER wrapper. Try
delimiter $$
CREATE TRIGGER `Meets insert` BEFORE INSERT ON `meets`
FOR EACH ROW
IF DATEDIFF(NEW.end_date, NEW.start_date) < 0 THEN
signal sqlstate '45000' set message_text = 'start_date must be before end_date';
END IF;
$$
delimiter ;
which gets past the Error 1064
See the bottom of This Post for DELIMITER verbiage.

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.

Getting Error code: 1064 while creating trigger

I am creating trigger but it shows me following error :
15:22:44 create trigger trigger3 before update on test.testdata
for each row
begin
if new.qty < 50 then
SIGNAL SQLSTATE VALUE '99999'
SET MESSAGE_TEXT = 'An error occurred';
end if;
end;
Error Code: 1064. 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 'SQLSTATE VALUE '99999'
SET MESSAGE_TEXT = 'An error occurred';
end i' at line 8 0.000 sec
my trigger code is :
delimiter //
create trigger trigger3 before update on test.testdata
for each row
begin
if new.qty < 50 then
SIGNAL SQLSTATE VALUE '99999'
SET MESSAGE_TEXT = 'An error occurred';
end if;
end;
//
delimiter ;
The MySQL 6.0 line was discontinued in 2009 (and never hit a production-level release).
Version 6.0.0-alpha-community-nt-debug, as the name suggests, was a debug build of an alpha release—as such, it really was intended for contributors to the MySQL project to perform early stage testing of the new version. It certainly should not be used in a production system. Where on Earth did you come upon it?
Finding documentation for v6.0 is somewhat difficult, since it was long ago removed from the MySQL website. There is however an archive on Oracle's website, where the documentation for SIGNAL states:
This statement was added in MySQL 6.0.11.
Therefore you will not be able to use SIGNAL with this version of MySQL. If you need to throw an error, you can execute a deliberately erroneous statement, such as calling a non-existent procedure:
CALL error();
However, if it wasn't obvious from what has been said above, you really should upgrade to a stable production-ready ("general release") version of MySQL server—such as v5.6.14 (which, despite the lower version number, is actually a much more recent release).

mysql trigger code deploying from TOAD but not from myphpadmin or from mysql console

I have a very simple trigger. I cretaed it from Toad for mysql tool and deployed it and its working perfect without any problem. when I gave it to the admin to deploy in the production server they are getting errors.
Phpmyadmin error:
1064 - 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 4
Mysql console error:
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 'END' at line 1
When asked, they are running the code from phpmyadmin and also they tried to run from mysql console they are getting errors
Its really frustrating and irritating why the same thing is running from a GUI tool and not working from a webtool or a console. 3 different behaviors in from three different tools
Then I tried the same thing and I got the error too. Its suprising me why
DROP TRIGGER IF EXISTS TRG_ ;
CREATE TRIGGER TRG_ BEFORE INSERT ON users FOR EACH ROW
BEGIN
DECLARE X INTEGER;
SELECT COUNT(*) into X FROM users;
IF X >= 16 THEN -- CHANGE THIS NUMBER
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'cant create more users';
END IF;
END;
Can some one tell me what I am doing wrong? I am not sure but I guess its something to do with delimiter keyword which I never understood the purpose.
Have a look at this question - MySQL: How do I use delimiters in triggers?
You should use delimiters when create source objects like triggers. The DELIMITER is not a MySQL statement, it a console command, and many MySQL clients supports this command. You may try this code in the MySQL console -
DROP TRIGGER IF EXISTS TRG_ ;
DELIMITER $$
CREATE TRIGGER TRG_ BEFORE INSERT ON users FOR EACH ROW
BEGIN
DECLARE X INTEGER;
SELECT COUNT(*) INTO X FROM users;
IF X >= 16 THEN -- CHANGE THIS NUMBER
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'cant create more users';
END IF;
END$$
DELIMITER ;
As I know some old phpmyadmin versions do not support delimiters.