Có, hoàn toàn có thể.
1. Nói chung không cho phép UPDATE
thành A
Tôi sẽ hoạt động với các đặc quyền:
REVOKE ALL ON TABLE A FROM public; -- and from anybody else who might have it
Điều đó khiến các superusers chẳng hạn như postgres
người bỏ qua những hạn chế thấp kém này. Nắm bắt những thứ bên trong chức năng kích hoạt của bạn trên A
với pg_has_role ()
:
IF pg_has_role('postgres', 'member') THEN
RETURN NULL;
END IF;
Nơi postgres
là một siêu người dùng thực tế. Lưu ý:điều này cũng ảnh hưởng đến những siêu nhân khác, vì họ là thành viên của mọi vai trò, ngay cả những siêu nhân khác.
Bạn có thể bắt gặp những người không phải là superusers theo cách tương tự (thay thế cho REVOKE
cách tiếp cận).
2. Cho phép UPDATE
cho vai trò daemon
Tạo vai trò không đăng nhập, được phép cập nhật A
:
CREATE ROLE a_update NOLOGIN;
-- GRANT USAGE ON SCHEMA xyz TO a_update; -- may be needed, too
GRANT UPDATE ON TABLE A TO a_update;
Tạo các hàm kích hoạt trên bảng B
và C
, sở hữu bởi vai trò daemon này và với SECURITY DEFINER
. Chi tiết:
Thêm vào chức năng kích hoạt trên A
:
IF pg_has_role('postgres', 'member') THEN
RETURN NULL;
ELSIF pg_has_role('a_update', 'member') THEN
RETURN NEW;
END IF;
Đối với các phụ thuộc 1:1 đơn giản, bạn cũng có thể làm việc với ràng buộc khóa ngoại (ngoài ra) bằng cách sử dụng KHI CẬP NHẬT CASCADE
.