Nếu bạn muốn xem xét sử dụng một thủ tục lưu trữ, bạn có thể sử dụng một DECLARE CONTINUE HANDLER
Dưới đây là một ví dụ:
CREATE TABLE users (
username VARCHAR(30),
first_name VARCHAR(30),
last_name VARCHAR(30),
PRIMARY KEY (username)
);
CREATE TABLE audit_table (timestamp datetime, description varchar(255));
DELIMITER $$
CREATE PROCEDURE add_user
(in_username VARCHAR(30),
in_first_name VARCHAR(30),
in_last_name VARCHAR(30))
MODIFIES SQL DATA
BEGIN
DECLARE duplicate_key INT DEFAULT 0;
BEGIN
DECLARE EXIT HANDLER FOR 1062 SET duplicate_key = 1;
INSERT INTO users (username, first_name, last_name)
VALUES (in_username, in_first_name, in_last_name);
END;
IF duplicate_key = 1 THEN
INSERT INTO audit_table VALUES(NOW(), 'Duplicate key ignored');
END IF;
END$$
DELIMITER ;
Hãy thêm một số dữ liệu, cố gắng để chèn một khóa trùng lặp:
CALL add_user('userA', 'Bob', 'Smith');
CALL add_user('userB', 'Paul', 'Green');
CALL add_user('userA', 'Jack', 'Brown');
Kết quả:
SELECT * FROM users;
+----------+------------+-----------+
| username | first_name | last_name |
+----------+------------+-----------+
| userA | Bob | Smith |
| userB | Paul | Green |
+----------+------------+-----------+
2 rows in set (0.00 sec)
SELECT * FROM audit_table;
+---------------------+-----------------------+
| timestamp | description |
+---------------------+-----------------------+
| 2010-10-07 20:17:35 | Duplicate key ignored |
+---------------------+-----------------------+
1 row in set (0.00 sec)
Nếu kiểm toán là rất quan trọng về mặt kĩ cơ sở dữ liệu, bạn có thể muốn chỉ cấp cho các quyền EXECUTE
để người dùng cơ sở dữ liệu của bạn chỉ có thể gọi các thủ tục được lưu trữ.
Nguồn
2010-10-07 17:59:15
Tôi đoán "không", trừ khi bạn sử dụng một thủ tục lưu trữ để thực hiện logic này. –