Có, thật tệ khi khiến hành vi phụ thuộc vào pg_trigger_depth()
Có lẽ tôi ít ác cảm hơn với những tuyên bố về chăn, nhưng nó có thể làm gì tốt? Không có đối số tôi có thể thấy là tại sao bạn lại muốn một tính năng như vậy. Mục đích chính của cơ sở dữ liệu là đảm bảo tính toàn vẹn dữ liệu. Và theo như tôi có thể thấy, và tôi có thể sai, việc sử dụng như vậy luôn là một sự vi phạm tiềm tàng về tính toàn vẹn dữ liệu. Trong câu trả lời của @ Erwin, anh nói "nếu bạn quên" . Điểm đảm bảo tính toàn vẹn là loại bỏ khả năng đó. Nếu một tác nhân có thể nhớ tất cả mọi thứ và hiểu hậu quả và mã xung quanh chúng, bạn có thể có được tính toàn vẹn dữ liệu từ bất cứ điều gì .
Chúng ta hãy giới thiệu một vài thuật ngữ, trong lập trình, chúng ta có
- "trạng thái" bao gồm mọi thứ màlập trình viên có quyền truy cập.
- "bối cảnh thực hiện" bao gồm môi trường để thực thi.
Chúng tôi tiếp tục có một thuật ngữ cho một chức năng, không có trạng thái mà chúng tôi gọi đó là một chức năng thuần túy ,
Hàm luôn đánh giá cùng một giá trị kết quả được đưa ra cùng (các) giá trị đối số. Giá trị kết quả chức năng không thể phụ thuộc vào bất kỳ thông tin hoặc trạng thái ẩn nào có thể thay đổi trong khi tiến hành chương trình tiến hành hoặc giữa các lần thực hiện khác nhau của chương trình, cũng không thể phụ thuộc vào bất kỳ đầu vào bên ngoài nào từ các thiết bị I / O (thường là xem bên dưới).
Sự khác biệt cho độ tinh khiết rất hữu ích vì nó giúp loại bỏ bất kỳ gánh nặng phải nhớ bất cứ điều gì trên danh nghĩa của máy tính, hoặc các lập trình viên: f(x) = y
là luôn luôn đúng. Ở đây bạn đang vi phạm độ tinh khiết ở nơi tồi tệ nhất - cơ sở dữ liệu. Và, bạn đang thực hiện nó một cách phức tạp và dễ bị lỗi - làm cho bối cảnh thực thi nội bộ trở thành một điều có thể sờ thấy trong trạng thái của ứng dụng DB của bạn.
Tôi sẽ không muốn điều đó. Chỉ cần xem xét sự phức tạp bạn phải đệm tinh thần.
Table A
's Trigger A
cháy
Trigger A
luôn luôn phát hành DML Table B
, bắn Trigger B
.
Trigger B
có điều kiện phát hành DML Table A
, bắn Trigger A
.
Trigger B
luôn luôn phát hành DML Table A
, bắn Trigger A
.
Trigger A
có điều kiện phát hành DML Table B
, bắn Trigger B
.
Trigger B
có điều kiện phát hành DML Table A
, bắn Trigger A
.
Trigger B
luôn luôn phát hành DML Table A
, bắn Trigger A
.
Nếu điều đó có vẻ phức tạp, hãy nhớ rằng "có điều kiện" có thể được mở rộng hơn nữa thành "nó đã xảy ra, nhưng nó có thể không luôn luôn xảy ra" và "nó đã không xảy ra, nhưng nó có thể xảy ra ở nơi khác."
Để pg_trigger_depth()
thậm chí hữu ích, bạn phải có một chuỗi các sự kiện phức tạp tương tự. Và, bây giờ, bạn muốn thực thi phụ thuộc vào nội dung thực thi trong chuỗi đó?
Tôi sẽ tránh điều này. Nếu hệ thống kích hoạt của bạn phức tạp như vậy, thì bạn đang chơi khoai tây nóng với một quả lựu đạn trong tủ một mình và dường như nó không có khả năng kết thúc tốt.