Kích hoạt trong MySQL để ngăn chèn


7

Tôi muốn tạo trình kích hoạt ngăn việc chèn vào bảng đặt chỗ của các chuyến bay ( numflights) không tồn tại.

Tables
----------------------------------------------
flights(numflight, origine, destination, dep, arr)
airports(code, city, country)
reservation(people, numflight, date_travel)

Các cột originedestinationchứa mã sân bay.


bạn có thể giới thiệu liên kết này cho truy vấn của mình .. roseindia.net/sql/trigger/mysql-trigger-after-update.shtml nhập mô tả liên kết tại đây Cảm ơn.
Chandresh

Để ngăn việc chèn vào bảng đặt phòng, điều cần thiết là trình kích hoạt "TRƯỚC KHI CHỌN" chứ không phải "CẬP NHẬT SAU" vì trình kích hoạt cần được ưu tiên trong trường hợp giá trị numflight bạn đang cố gắng CHỌN VÀO bảng đặt phòng KHÔNG EXIST trong bảng chuyến bay. Đây là lý do tại sao tôi sử dụng ví dụ được cung cấp bởi cuốn sách 'Lập trình thủ tục lưu trữ MySQL'.
RolandoMySQLDBA

Điều này nên tầm thường. Thêm một khóa ngoại.
ypercubeᵀᴹ 6/2/2016

Câu trả lời:


4

Ví dụ sau đây dựa trên phương pháp bẫy lỗi được xử lý bằng jerry trong các kích hoạt từ Chương 11, Trang 254-256 của cuốn sách Lập trình thủ tục lưu trữ MySQL dưới tiêu đề 'Xác thực dữ liệu với Triggers' :

DELIMITER $$

CREATE TRIGGER reservation_bi BEFORE INSERT ON reservation FOR EACH ROW
BEGIN

DECLARE found_count,dummy INT;

SELECT COUNT(1) INTO found_count FROM flights WHERE numflight=new.numflight;
IF found_count = 0 THEN
    SELECT 'Cannot Insert This Reservation Because Flight Number is Invalid'
    INTO dummy FROM reservation WHERE numflight=new.numflight;
END IF;

END; $$

DELIMITER ;

Nếu có xác nhận khác được thực hiện, hãy làm theo phương pháp bẫy lỗi tương tự này !!!

CẬP NHẬT

Lý do cuốn sách gợi ý việc ưu tiên Trình kích hoạt theo cách này xuất phát từ thực tế là Ngôn ngữ thủ tục lưu trữ MySQL không có TÍN HIỆU thực hiện thành ngôn ngữ (tất nhiên, TÍN HIỆU là tiêu chuẩn ANSI).

Các tác giả của cuốn sách đã tạo ra các công việc xung quanh bằng cách gọi các câu lệnh SQL đúng về mặt cú pháp nhưng thất bại khi chạy. Trang 144-145 (Chương 6: Xử lý lỗi) của cuốn sách đưa ra các ví dụ này về việc ưu tiên trực tiếp Quy trình được lưu trữ (Ví dụ 6-18) hoặc bằng cách mô phỏng TÍN HIỆU (Ví dụ 6-19 và 6-20).

# Example 6-18. Using a nonexistent column name to force an error to the calling program

    CREATE PROCEDURE sp_update_employee_dob2
        (p_employee_id INT, p_dob DATE)
    BEGIN
        IF datediff(curdate(),p_dob)<(16*365) THEN
            UPDATE `Error: employee is too young; Employee must be 16 years or older`
                SET x=1;
        ELSE
            UPDATE employees
               SET date_of_birth=dob
            WHERE employee_id=p_dob;
       END IF;
    END;

# Example 6-19. Standard procedure to emulate SIGNAL

    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;

# Example 6-20. Using our SIGNAL emulation procedure to raise an error

    CREATE PROCEDURE sp_update_employee_dob2
        (p_employee_id INT, p_dob DATE)
    BEGIN
        IF datediff(curdate(),p_dob)<(16*365) THEN
            CALL my_signal('Error: employee is too young; Employee must be 16 years or older')
        ELSE
            UPDATE employees
               SET date_of_birth=dob
            WHERE employee_id=p_dob;
       END IF;
    END;

Thật không may, việc mô phỏng TÍN HIỆU từ các ví dụ 6-19 và 6-20 có thể được thực hiện trong Triggers. Các tác giả của cuốn sách đã sử dụng kỹ thuật này trong ví dụ 6-18 để tránh các yếu tố kích hoạt ở trang 254-256. Đây là lý do tại sao đề xuất của cuốn sách phải là cách để đi.


2

Tại sao không loại bỏ quyền INSERT?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.