Bài học theo mô-đun (3/4)
Giới thiệu về trigger
Trình kích hoạt là một hộp ma thuật (cảm biến) tự động chạy một đoạn logic TRƯỚC hoặc SAU một sự kiện chèn, cập nhật hoặc xóa trong dữ liệu.\nTuy nhiên, trước khi dạy một bảng phản ứng, chúng ta cần cung cấp cho nó một "Hàm kích hoạt" đặc biệt được viết bằng PL/pgSQL và phải kết thúc bằng cách trả về một định dạng tổng hợp có tên là "TRIGGER".
Các hàm này không chấp nhận các đối số thông thường trong dấu ngoặc đơn; thay vào đó, họ cung cấp miễn phí các đối tượng ma thuật tích hợp NEW và OLD chứa dữ liệu hàng gốc hoặc hàng đến từ bảng mà cảm biến đang xem!
CREATE OR REPLACE FUNCTION audit_deletions()
RETURNS TRIGGER AS $$
BEGIN
-- OLD.id is magically the id value of the poor record being deleted
INSERT INTO audit_log (table_name, record_id, action)
VALUES (TG_TABLE_NAME, OLD.id, 'DELETE');
RETURN OLD; -- Triggers before a Delete route must grant the exit
END;
$$ LANGUAGE plpgsql;Thủ tục này thực hiện công việc khó khăn khi ghi vào nhật ký. Sau đó, ở bước thứ hai, nó sẽ được kết nối vĩnh viễn với các sự kiện của bảng mà chúng ta muốn bảo vệ.
Hãy tự mình thử
Chúng tôi cần bảo vệ khách hàng: không ai dưới 18 tuổi (kiểm tra ảo của chúng tôi) hoặc ngoài logic hư cấu, chúng tôi muốn buộc chuỗi 'first_name' được chuyển vào thời điểm INSERT luôn được lưu trữ bằng chữ in hoa trong cơ sở dữ liệu, bỏ qua mọi định dạng máy khách JS.\nViết Hàm kích hoạt có tên 'force_uppercase_name()'. Nó không chấp nhận đối số ().\nNó trả về TRIGGER. Tạo mẫu nội dung.\nBuộc gán toàn bộ đối tượng đến thông qua phép gán ma thuật 'NEW.first_name = UPPER(NEW.first_name);'. Sau đó TRẢ LẠI biến MỚI được định hình lại.
Hiển thị gợi ý
TẠO HOẶC THAY THẾ CHỨC NĂNG Force_uppercase_name() TRẢ LẠI KÍCH HOẠT NHƯ $$ BEGIN NEW.first_name = UPPER(NEW.first_name); TRẢ LẠI MỚI; KẾT THÚC; $$ NGÔN NGỮ plpgsql;
Giải pháp khả dụng sau 3 lần thử
Tạo Hàm kích hoạt 'protect_price_drops()' để chặn các bản cập nhật độc hại trong đó kẻ tấn công sắp tiết kiệm một mức giá thấp đến mức nực cười cho một sản phẩm.\nSử dụng logic như 'IF NEW.unit_price < OLD.unit_price THEN', đưa ra một ngoại lệ gốc khiến mọi thứ sụp đổ.\nMột ngoại lệ PL/pgSQL nghiêm trọng sử dụng biểu mẫu 'RAISE EXCEPTION ''Prezzo non abbassabile!'';'.
Hiển thị gợi ý
BẮT ĐẦU NẾU NEW.unit_price < OLD.unit_price THÌ TĂNG NGOẠI TRỪ 'Prezzo non abbassabile!'; KẾT THÚC NẾU; TRẢ LẠI MỚI; KẾT THÚC;
Giải pháp khả dụng sau 3 lần thử