How to write signal function in MySQL that can be called from Triggers and Stored Functions?
1
vote
1
answer
2844
views
In my Database I have a **table**:
Employee
with recursive association, an employee can be boss of other employee.
The Table Description:
mysql> DESC Employee;
+-------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| SSN | varchar(64) | NO | PRI | NULL | |
| name | varchar(64) | YES | | NULL | |
| designation | varchar(128) | NO | | NULL | |
| MSSN | varchar(64) | NO | MUL | NULL | |
+-------------+--------------+------+-----+---------+-------+
Present State of Employee Table is:
mysql> SELECT * FROM Employee;
+-----+------+-------------+------+
| SSN | name | designation | MSSN |
+-----+------+-------------+------+
| 1 | A | OWNER | NULL |
| 2 | B | BOSS | 1 |
| 3 | C | WORKER | 2 |
| 4 | D | BOSS | 2 |
| 5 | E | WORKER | 4 |
| 6 | F | WORKER | 1 |
| 7 | G | WORKER | 4 |
+-----+------+-------------+------+
7 rows in set (0.00 sec)
Following is hierarchical relation among the rows in table:
A
/ \
B F
/ \
c D
/ \
G E
**I wanted to impose following constraints on INSERT**:
- An employee can't BOSS of himself. Hence query like.
INSERT INTO Employee VALUES ("8", "H", "BOSS", "8");
Should be declined.
- New new OWNER
can be inserted.
As I am working with MYSQL version previous than 5.5 (doesn't supports signal).
So I am using a **my_signal()
** as a stored procedure.
Written Like this:
> CREATE PROCEDURE my_signal
(in_errortext VARCHAR(255))
> BEGIN
> SET @sql=CONCAT('UPDATE ', in_errortext, '
SET x=1');
> PREPARE my_signal_stmt FROM @sql;
> EXECUTE my_signal_stmt;
> DEALLOCATE PREPARE my_signal_stmt;
> END//
And **to Apply constraints** I written a Trigger
as I came to know that check constraints are not yet implemented in MySQL
!
> DELIMITER $$
> CREATE
> TRIGGER employee_before_insert
BEFORE INSERT
> ON Employee
> FOR EACH ROW BEGIN
> CASE
> WHEN NEW.designation = 'OWNER' THEN
> CALL my_signal('Error: can not insert new OWNER !');
>
> WHEN NEW.SSN = NEW.MSSN THEN
> CALL my_signal('Error: Row can not reference itself!');
> END CASE;
> END$$
> DELIMITER ;
It was successfully compiled and loaded in database. But when I tried to insert:
mysql> INSERT INTO Employee VALUES ("12", "K", "BOSS", "12");
ERROR 1336 (0A000): Dynamic SQL is not allowed in stored function or trigger
I Learn here and here that
- SQL prepared statements (PREPARE, EXECUTE, DEALLOCATE PREPARE) can be used in stored procedures, but not stored functions or triggers. Thus, stored functions and triggers cannot use dynamic SQL (where you construct statements as strings and then execute them).
After some effort I can write an another trigger as below. **Working fine** as per my requirement.
> mysql> CREATE
> -> TRIGGER employee_before_insert
BEFORE INSERT
> -> ON Employee
> -> FOR EACH ROW BEGIN
> -> IF UCASE(NEW.designation) = 'OWNER' THEN /*UCASE*/
> -> UPDATE Error: can not insert new OWNER !
set x=1;
> -> END IF;
> -> IF (NEW.SSN = NEW.MSSN) THEN
> -> UPDATE Error: Row can not reference itself!
set x=1;
> -> END IF;
> -> END$$
> Query OK, 0 rows affected (0.08 sec)
>
> mysql> DELIMITER ;
> mysql> INSERT INTO Employee VALUES ("12", "K", 'owner', "11");
> ERROR 1146 (42S02): Table 'dumy.Error: can not insert new OWNER !'
doesn't exist
> mysql> INSERT INTO Employee VALUES ("12", "K", 'Ajay', "12");
> ERROR 1146 (42S02): Table 'dumy.Error: Row can not reference itself!'
doesn't exist
But I am already using my_signal()
in many procedures and I need to write many new Stored functions and triggers where I would need my_signal()
functions again.
**Can someone suggest me other way to write my_signal() through which I can print customized error message?**
I tried as follows:
> DELIMITER $$
> CREATE PROCEDURE my_signal
(in_errortext VARCHAR(255))
> DECLARE sql varchar(512);
> BEGIN
> SET sql=CONCAT('UPDATE ', in_errortext, '
SET x=1');
> UPDATE sql SET x =1;
> END$$
But useless :( .
Please help me on this.I will be very thankful!
I am not good at MYSQL specially @ Stored Procedures.
If you would like to try on your system here you can quickly find commands to build this database.
Asked by Grijesh Chauhan
(581 rep)
Nov 25, 2012, 06:06 AM
Last activity: Dec 28, 2021, 07:51 PM
Last activity: Dec 28, 2021, 07:51 PM