Error while creating trigger - mysql

delimiter #
create trigger update_recharge_due_onrenewal after insert on recharge
for each row set
begin
update due_amount SET due_amount.amount=due_amount.amount-(select rate from
internet_package where recharge.package_id = internet_package.package_id)
where
due_advance.user_id = recharge.user_id;
end;#
Why is this showing error - unknown system variable 'begin'

Change for each row set by for each row.

Related

'RAISERROR' must be declared

CREATE TRIGGER x AFTER INSERT ON itemtype
FOR EACH ROW
DECLARE
minn itemtype.PRICE%type;
BEGIN
select MIN(itemtype.PRICE) into minn from itemtype;
IF (:new.PRICE > minn*4) then RAISERROR('Custom text');
END IF;
END;
/
I'm trying to create a trigger that raises an error when I try to insert a new entry into the itemtype with itemtype.PRICE column value is greater than 4 times the current low priced item on the table.
I get these compilation errors when I try to create the trigger.
LINE/COL ERROR
-------- --------------------------------------------------------------
5/31 PL/SQL: Statement ignored
5/31 PLS-00201: identifier 'RAISERROR' must be declared
I have also tried
CREATE TRIGGER x AFTER INSERT ON itemtype
FOR EACH ROW
DECLARE
minn itemtype.PRICE%type;
BEGIN
select MIN(itemtype.PRICE) into minn from itemtype;
if (:new.PRICE > minn*4) then raise_application_error(-20010,'Too Expensive');
END IF;
END;
/
which complies, but when i try to insert a new entry into the table I get theses errors saying my trigger fails.
SQL> insert into itemtype(ITEMNUM,NAME,PICTURE,PRICE,BELONGSTO ) VALUES ('A11','The who knows','',10.99,'P');
insert into itemtype(ITEMNUM,NAME,PICTURE,PRICE,BELONGSTO ) VALUES ('A11','The who knows','',10.99,'P')
*
ERROR at line 1:
ORA-04091: table USERNAME.ITEMTYPE is mutating, trigger/function may not see it
ORA-06512: at "USERNAME.X", line 5
ORA-04088: error during execution of trigger 'USERNAME.X'
Try use PRAGMA AUTONOMOUS_TRANSACTION in trigger.
Look my answer on this question:
SQL trigger on delete mutating table

MySQL: Trigger Before Update Not Working

I'm trying to get a trigger to run before an update is processed on a per record level of a table.
What I'm trying to do is when an update occurs on a record for the qst_title column, if the column qst_perma_title is NULL then the qst_perma_title column is updated with the value in the qst_title column and the qst_title column is updated as per the original update query.
I'm using the code below but no errors are shown and the column qst_perma_title isn't updated.
The current values are:
qst_title = 'Old Title'
qst_perma_title = NULL
query
UPDATE TD_QUESTION SET qst_title = 'New Title Value' WHERE qst_id = 1;
trigger
DELIMITER //
CREATE TRIGGER TRG_QST_UPD
BEFORE UPDATE ON TD_QUESTION
FOR EACH ROW
BEGIN
IF OLD.`qst_perma_title` IS NULL THEN
SET NEW.`qst_perma_title` = OLD.`qst_title`;
END IF;
END//
DELIMITER ;
CREATE TRIGGER TRG_QST_UPD
BEFORE UPDATE ON TD_QUESTION
FOR EACH ROW
IF OLD.qst_perma_title IS NULL THEN
SET NEW.qst_perma_title = OLD.qst_title;
END IF;
First run this query and then try updating. I checked, it is working fine for me.

MYSQL Trigger to update different table based on inserted value

I need to update oc_product_attribute with a value obtained from an inserted row in vehicles. How can I get this specific value? (xxxCOLUMN_VALUExxx)
CREATE TRIGGER vehicle_attributes AFTER INSERT ON vehicles
FOR EACH ROW
BEGIN
UPDATE oc_product_attribute SET oc_product_attribute.vehicle_name =
(SELECT CONCAT(vehicles.make_name, ' ', vehicles.model_name, ' ',
vehicles.chassis) FROM vehicles WHERE vehicles.id = xxxCOLUMN_VALUExxx)
WHERE oc_product_attribute.id = xxxCOLUMN_VALUExxx
END
Even simplified below: I still get an error in MYSQL:
CREATE TRIGGER vehicle_attributes AFTER INSERT ON vehicles
FOR EACH ROW
BEGIN
UPDATE oc_product_attribute
SET oc_product_attribute.vehicle_name =
CONCAT(NEW.make_name,' ',NEW.model_name,' ',NEW.chassis);
END;
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 7
And Simplified further:
CREATE TRIGGER vehicle_attributes AFTER INSERT ON vehicles
FOR EACH ROW
BEGIN
UPDATE oc_product_attribute
SET oc_product_attribute.vehicle_name = 'test' WHERE 1
END;
I still get the same error - Could it be MYSQL doesn't have triggers enabled?
I guess you need to update oc_product_attribute like this:
CREATE TRIGGER vehicle_attributes AFTER INSERT ON vehicles
FOR EACH ROW
BEGIN
UPDATE oc_product_attribute
SET oc_product_attribute.vehicle_name =
CONCAT(NEW.make_name,' ',NEW.model_name,' ',NEW.chassis)
WHERE oc_product_attribute.id = NEW.id;
END
Although I am no sure if oc_product_attribute.id is holding the vehicles.id. However, the important poart is that in an INSERT AFTER TRIGGER you can access the values of the inserted row by NEW.columnName.
N.B. In update triggers you also can access the value before the change with OLD.columnName

MYSql after update trigger not updating table

I have the following trigger:
CREATE DEFINER = CURRENT_USER
TRIGGER `radia`.`orderstable_AFTER_UPDATE`
UPDATE ON `orderstable`
FOR EACH ROW begin
SET #VATCharged = Amount * (VAT*0.01);
But the VATCharged column does not update after there is a change to the amount or VAT.
The table has the following columns; Order Number(INT), AccNo(VARCHAR), Invoice Number(VARCHAR), Description(VARCHAR), Amount(INT), VAT(INT) and VATCharged(INT).
What is the solution to this problem?
You need to specify old or new against the column to get either old value before update or new value after update
set #VATCharged := new.Amount * (new.VAT*0.01);
EDIT :
If you want to update the VATCharged column in the table, then the trigger needs to be before update something as
delimiter //
create trigger `radia`.`orderstable_AFTER_UPDATE`
before update on `orderstable`
for each row
begin
set new.VATCharged = new.Amount * (new.VAT*0.01);
end ; //
delimiter ;

MySql Trigger Syntax to lookup a value in a table and update in the updated row

I'm converting some old legacy Interbase database to MySql and I am having some trouble converting triggers. This is what I came so far, but can't seem to understand what are the errors in the following triggers. Can you help fix the syntax?
DELIMITER ^
In these 2 cases it says into new.FinancialCode is incorrect. What is the correct form to accomplish this? (Lookup a value in a table and change it in the updated row)
Create Trigger triggerFinancialCode BEFORE UPDATE ON FLOW
FOR EACH ROW
begin
Select FinancialCode FROM Accounts where AccountCode = new.AccountCode
into new.FinancialCode ;
end ^
Create Trigger triggerFinancialCodePredicted BEFORE UPDATE ON PREDICTED_FLOW
FOR EACH ROW
begin
Select FinancialCode FROM Accounts where AccountCode = new.AccountCode
into new.FinancialCode ;
end ^
Try this code -
CREATE TRIGGER triggerFinancialCode BEFORE UPDATE ON FLOW
FOR EACH ROW
BEGIN
SET #var = NULL;
SELECT FinancialCode INTO #var FROM Accounts WHERE AccountCode = NEW.AccountCode;
SET NEW.FinancialCode = #var;
END
Do the same for second trigger.