트리거에서 동적 함수 호출

jabclab

내 사용 사례에서는 테이블에 삽입 한 후 정적 인수를 사용하여 동적 (미리 정의 된) 함수를 실행할 수 있어야합니다.

논리적으로 생각하고 있습니다.

  1. 자신의 테이블에서 함수 호출 (예 : 이름 및 정적 인수)을 정의합니다.
  2. 이러한 정적 함수 호출 정의를 다른 테이블의 레코드와 연결합니다 (동적 함수 호출을 트리거 할 삽입).
  3. 삽입시 트리거를 사용하여 정적 함수 정의 테이블을 쿼리하고 얻은 정적 인수로 얻은 함수를 실행합니다.

지금까지 내가 도착한 것은 다음과 같습니다.

동적으로 호출 할 사용 가능한 함수 풀

create function f1(num int) returns boolean as $$
  -- ...
$$ language plpgsql;

create function f2(name text, age int) returns boolean as $$
  -- ...
$$ language plpgsql;

create function f3(first_name text, last_name text) returns boolean as $$
  -- ...
$$ language plpgsql;

함수 호출

create table function_invocations(
  id integer not null,
  name text not null,
  args text not null, -- (not sure if this should be an array)
  primary key(id)
);

create function verify_function_exists() returns trigger as $$
  -- query information_schema to verify there is
  -- a function with specified name and that
  -- specified args satisfy function's
  -- signature.
$$ language plpgsql;

create trigger function_exists_trig
  before insert on function_invocations
  for each row
  execute procedure verify_function_exists();

삽입 결과 동적 함수 호출이 발생하는 테이블

create table my_data(
  id integer not null,
  function_invocation_id integer not null,
  -- etc.
  primary key(id),
  foreign key(function_invocation_id) references function_invocations(id)
);

create function exec_dynamic_function() returns trigger as $$
  -- retrieve the function name and args from
  -- function_definitions and execute the
  -- function specified by `name` with the
  -- provided `args`.  
$$ language plpgsql;

create trigger function_invocations_trig
  after update on my_data
  for each row
  execute procedure exec_dynamic_function();

이것이 작업에 대한 올바른 방법입니까? JS 배경에서 왔기 때문에 잘못된 방식으로 생각할 수 있습니다.

var api = {
  my_func: function (age, name) {
    console.log('%d %s', age, name);
  }
};

var fn = 'my_func';
var args = [50, 'john'];

api[fn].apply(api, args);

내 주요 관심사는 function_invocations테이블의 행에서 참조하는 함수가 실제로 존재하고 정의 된 인수가 유효한지 확인하는 방법입니다 (또는 적어도 유효하도록 강제 할 수 있음).

PostgreSQL 9.4.1을 사용하고 있습니다.

Erwin Brandstetter

다음은 CHECK트리거 대신 간단한 제약 조건 이있는 솔루션입니다 .

CREATE TABLE func (
  func_id serial PRIMARY KEY
, func text NOT NULL
, args text NOT NULL
, CHECK ((func || '(' || args || ')')::regprocedure IS NOT NULL)
);

CHECK제약,보다 빠르고 안정적인 가능한 트리거 솔루션보다 간단합니다. 이 변형은 모든 최신 Postgres 버전에서 작동합니다.

regprocedure제약 조건이 평가를 완료하기 전에 유효하지 않은 함수에 대한 캐스트가 실패합니다. 이는 해당 오류 메시지에 반영됩니다.

Postgres 9.4+에서는 to_regprocedure()캐스트 대신 new 사용하여 예외를 발생시키지 않습니다. CHECK대신 제약 조건 에서 예외가 발생 합니다. 자세히 (마지막 장) :

공장:

INSERT INTO func(func, args) VALUES ('substring','text, int');

예외와 함께 실패 :

INSERT INTO func(func, args) VALUES ('nonexistant','text, int');

SQL 바이올린.

에 대한 UNIQUE제약 도 고려할 것 입니다 (func, args). 동일한에 대해 유효한 텍스트 표현이 여러 개있을 수 있습니다 args. 숨겨진 중복을 찾기위한 빠른 확인은 다음과 같습니다.

SELECT func, string_to_array(args, ', ')::regtype[], count(*)
FROM   func
GROUP  BY 1, 2
HAVING count(*) > 1;

캐스트가 아니기 때문에 고유 인덱스에서이 식을 사용할 수 regtype없습니다 IMMUTABLE. 당신은 속임수를 써야 할 것입니다 ...

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C #-동적 라이브러리 DLL에서 함수 호출

분류에서Dev

자바 8 스트림에서 동적 함수 호출

분류에서Dev

함수의 동적 호출

분류에서Dev

변수에서 정적 함수 호출

분류에서Dev

Scheme에서 수동 함수 호출

분류에서Dev

Windows Form에서 동적으로 함수 호출

분류에서Dev

동적으로로드 된 Javascript 파일에서 함수 호출

분류에서Dev

다른 파일에서 동적 함수 호출-Python

분류에서Dev

SLOT 내부에서 동적으로 함수 호출

분류에서Dev

동적 SQL 문에서 함수 호출 사용

분류에서Dev

JQuery에서 동적으로 함수를 호출하는 방법

분류에서Dev

배포 된 웹앱에서 호출하는 동안 Azure 함수 앱이 트리거되지 않음

분류에서Dev

트리거 후 5 초 동안 함수 호출 비활성화

분류에서Dev

HTML에서 자바 스크립트 개체 함수를 동적으로 호출

분류에서Dev

Android 활동에서 JS 함수 호출

분류에서Dev

OnClick ()에서 활동 함수 호출

분류에서Dev

PhalconPHP, 볼트 및 사용자 지정 함수 : 동적 함수 호출 방법

분류에서Dev

동적 인수로 함수 호출

분류에서Dev

자바 스크립트에서 배열 값으로 동적 함수로 함수 호출

분류에서Dev

함수 호출을 동적 변수에 저장할 수 있습니까?

분류에서Dev

비동기 함수에서 동기 함수 호출

분류에서Dev

동기화 함수에서 비동기 함수 호출

분류에서Dev

비 비동기 함수 내에서 비동기 함수 호출

분류에서Dev

내부에서 호출되는 다른 함수로 동일한 함수 호출

분류에서Dev

다른 함수 내에서 전역 적으로 함수 호출

분류에서Dev

동적으로 함수 인스턴스화 및 JavaScript에서 메서드 호출

분류에서Dev

루프 내에서 동적으로 생성 된 함수 호출에 값 전달

분류에서Dev

Angular에 의해 동적으로 생성 된 객체에서 jQuery 함수 호출

분류에서Dev

동적 개체 함수 호출 입력

Related 관련 기사

  1. 1

    C #-동적 라이브러리 DLL에서 함수 호출

  2. 2

    자바 8 스트림에서 동적 함수 호출

  3. 3

    함수의 동적 호출

  4. 4

    변수에서 정적 함수 호출

  5. 5

    Scheme에서 수동 함수 호출

  6. 6

    Windows Form에서 동적으로 함수 호출

  7. 7

    동적으로로드 된 Javascript 파일에서 함수 호출

  8. 8

    다른 파일에서 동적 함수 호출-Python

  9. 9

    SLOT 내부에서 동적으로 함수 호출

  10. 10

    동적 SQL 문에서 함수 호출 사용

  11. 11

    JQuery에서 동적으로 함수를 호출하는 방법

  12. 12

    배포 된 웹앱에서 호출하는 동안 Azure 함수 앱이 트리거되지 않음

  13. 13

    트리거 후 5 초 동안 함수 호출 비활성화

  14. 14

    HTML에서 자바 스크립트 개체 함수를 동적으로 호출

  15. 15

    Android 활동에서 JS 함수 호출

  16. 16

    OnClick ()에서 활동 함수 호출

  17. 17

    PhalconPHP, 볼트 및 사용자 지정 함수 : 동적 함수 호출 방법

  18. 18

    동적 인수로 함수 호출

  19. 19

    자바 스크립트에서 배열 값으로 동적 함수로 함수 호출

  20. 20

    함수 호출을 동적 변수에 저장할 수 있습니까?

  21. 21

    비동기 함수에서 동기 함수 호출

  22. 22

    동기화 함수에서 비동기 함수 호출

  23. 23

    비 비동기 함수 내에서 비동기 함수 호출

  24. 24

    내부에서 호출되는 다른 함수로 동일한 함수 호출

  25. 25

    다른 함수 내에서 전역 적으로 함수 호출

  26. 26

    동적으로 함수 인스턴스화 및 JavaScript에서 메서드 호출

  27. 27

    루프 내에서 동적으로 생성 된 함수 호출에 값 전달

  28. 28

    Angular에 의해 동적으로 생성 된 객체에서 jQuery 함수 호출

  29. 29

    동적 개체 함수 호출 입력

뜨겁다태그

보관