PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Chỉ cho phép chèn từ bên trong một trình kích hoạt

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 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 .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để so khớp các phần tử trong một mảng kiểu kết hợp?

  2. Cải thiện hiệu suất của các truy vấn Postgres jsonb kết hợp với các truy vấn quan hệ

  3. Cách kết hợp hai truy vấn con trong SQLAlchemy và postgresql

  4. Tìm nạp các hàng dựa trên tình trạng

  5. Tự động tăng trên một phần khóa chính với Entity Framework Core