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

Trình kích hoạt chung để hạn chế số lần chèn dựa trên số lượng

Tôi đã thực hiện một loại trình kích hoạt chung tương tự. Phần khó nhất là lấy mục nhập giá trị trong NEW ghi lại dựa trên tên cột.

Tôi đang làm theo cách sau:

  • chuyển đổi NEW dữ liệu thành mảng;
  • tìm attnum của cột và sử dụng nó làm chỉ mục cho mảng.

Phương pháp này hoạt động miễn là không có dấu phẩy trong dữ liệu :( Tôi không biết có cách nào khác để chuyển đổi NEW hoặc OLD biến vào mảng giá trị.

Hàm sau đây có thể hữu ích:

CREATE OR REPLACE FUNCTION impose_maximum() RETURNS trigger AS $impose_maximum$
DECLARE
  _sql  text;
  _cnt  int8;
  _vals text[];
  _anum int4;
  _im   record;

BEGIN
 _vals := string_to_array(translate(trim(NEW::text), '()', ''), ',');

 FOR _im IN SELECT * FROM imposed_maximums WHERE table_name = TG_TABLE_NAME LOOP
  SELECT attnum INTO _anum FROM pg_catalog.pg_attribute a
    JOIN pg_catalog.pg_class t ON t.oid = a.attrelid
   WHERE t.relkind = 'r' AND t.relname = TG_TABLE_NAME
     AND NOT a.attisdropped AND a.attname = _im.column_group;

  _sql := 'SELECT count('||quote_ident(_im.column_count)||')'||
          ' FROM '||quote_ident(_im.table_name)||
          ' WHERE '||quote_ident(_im.column_group)||' = $1';

  EXECUTE _sql INTO _cnt USING _vals[_anum];

  IF _cnt > CAST(_im.max_size AS int8) THEN
    RAISE EXCEPTION 'Maximum of % hit for column % in table %(%=%)',
      _im.max_size, _im.column_count,
      _im.table_name, _im.column_group, _vals[_anum];
  END IF;
 END LOOP;

 RETURN NEW;
END; $impose_maximum$ LANGUAGE plpgsql;

Hàm này sẽ kiểm tra tất cả các điều kiện được xác định cho một bảng nhất định.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SqlAlchemy (Flask + Postgres):Làm cách nào để cập nhật chỉ một thuộc tính cụ thể của trường json?

  2. Giải thích về JSONB do PostgreSQL giới thiệu

  3. Việc thêm các bảng không liên quan trong mệnh đề WITH có làm chậm truy vấn trong PostgreSQL không?

  4. cách ngăn các bản sao bằng truy vấn nối bên trong (Postgres)

  5. Làm thế nào để quản lý các kết nối db trên máy chủ?