Gọi nhiều chức năng từ kích hoạt?


8

Tôi chạy PostgreSQL-9.2.4

Có thể gọi 2 chức năng từ một kích hoạt?

Giả sử tôi có hai hàm cho hai bảng khác nhau được thực thi nếu kích hoạt sau khi kích hoạt:

Kích hoạt:

CREATE TRIGGER start ON system_status FOR EACH ROW
WHEN ((new.event = start_task))
EXECUTE PROCEDURE ...()

Chức năng 1: (Khi tác vụ bắt đầu => xóa mọi tác vụ tiếp theo được gán trước đó cho hệ thống này)

CREATE FUNCTION void_next_task() RETURNS trigger AS $$

BEGIN
  DELETE FROM tasks_status ts
  WHERE ts.system = NEW.system
  AND ts.event = 'next_task';
  RETURN NEW;
  END;

$$

LANGUAGE plpgsql

Chức năng 2: (Nếu chèn kết hợp tasksystemđã được trình bày trong bảng => đánh dấu bất kỳ bản ghi nào trước đó với kết hợp này là deleted)

CREATE FUNCTION void_dup_task() RETURNS trigger AS $$

BEGIN
  UPDATE system_status ss
  SET deleted = 'TRUE'
  WHERE ss.system = NEW.system
  AND ss.task = NEW.task
  AND ss.deleted IS FALSE;
  RETURN NEW;
  END;

$$

LANGUAGE plpgsql

Vì vậy, tôi đã kết thúc với các cách sau để giải quyết nó:

  1. Để có một kích hoạt mà gọi hai chức năng;
  2. Để có một chức năng thực hiện cập nhật trên một bảng và xóa trên một bảng khác;
  3. Để có hai kích hoạt chính xác giống nhau và hai chức năng khác nhau;

Trước khi tôi đi trước và thực hiện giải pháp, 3bạn có thể tư vấn cho tôi nếu giải pháp 1hoặc hoàn toàn 2có thể?

Câu trả lời:


10

Một trình kích hoạt chỉ có thể gọi một hàm kích hoạt, vì vậy không có mục 1.

Hình thức thích hợp hơn là mục 2. IMO. Bạn có thể đặt bao nhiêu câu lệnh SQL vào một hàm plpgsql như bạn muốn.

Mục 3. là có thể, quá. Chà, không chính xác cùng một kích hoạt, tên sẽ phải khác nhau. Kích hoạt trên cùng một sự kiện cháy theo thứ tự bảng chữ cái, btw. Nhưng tôi thấy không có lợi trong hai chức năng riêng biệt. Chỉ cần nhiều mã và chi phí chung và hai lệnh gọi hàm, đắt hơn.

2. là người chiến thắng không thể tranh cãi.


2

Để hoàn thiện, cũng có số 4 - tạo các hàm thông thường, không kích hoạt và gọi cả hai (hoặc chỉ một, tùy thuộc vào một số điều kiện) từ hàm kích hoạt. Điều này có một số nhược điểm: bạn không thể sử dụng MỚI và OLD trong các chức năng thông thường và bạn phải truyền dữ liệu cho các chức năng của mình, điều này có nghĩa là thậm chí nhiều chi phí hơn trong trường hợp 3. Trong trường hợp của bạn, sẽ không có lợi ích đáng kể nào cho nó. Lợi ích duy nhất tôi có thể tưởng tượng là khả năng đọc mã cho các hàm kích hoạt rất phức tạp.

Tôi đã làm điều này cho một hàm lớn, phân nhánh nhiều (thực hiện một số kiểm tra và cập nhật trên bảng A, sau đó thực hiện một số cập nhật khác trên bảng B, C hoặc D tùy thuộc vào cột A.1, sau khi các bản cập nhật cho B thực hiện một số thứ tương tự cho F hoặc G v.v.); và tôi vẫn tự hỏi liệu tôi nên giữ nó tách hoặc trở lại một chức năng duy nhất.

EDIT: một trường hợp khác khi điều này hữu ích là khi một số phần của mã được chia sẻ bởi một số chức năng kích hoạt. Sau đó, có thể hữu ích khi viết mã chỉ một lần và gọi hàm thay vì viết lại toàn bộ mã. Một lần nữa, nó không có giá trị cho một vài dòng mã như trong trường hợp của bạn.

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.