PostgreSQL:Function
NULLIF
- exp1값과 exp2값이 동일하면 NULL을 그렇지 않으면 exp1을 반환
-
CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END
현재 접속한 Role/User 확인
DO
Function 을 개발/테스트할때 Function 문법/기능을 확인하고 싶을때가 있다. Function 을 생성하고 테스트한 뒤 Function 을 삭제하는 것은 너무 비효율적이며 이런 상황에서 사용하는 것이 DO
기능/SQL명령어이다.
DO 는 Parameter가 없고 return void 방식의 임시 Function 이라고 생각하면 될 것 같다.
COALESCE
Null 체크할 때 사용한다.
대체 값은 컬럼이 null인 경우 대체 값으로 반환한다. (다른 컬럼으로 대체할 수 있다)
Example
컬럼
지정 문자열
null
json
Trigger Functions
CREATE FUNCTION
문법만 보면 뭔가 복잡하다:
CREATE [ OR REPLACE ] FUNCTION
name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
[ RETURNS rettype
| RETURNS TABLE ( column_name column_type [, ...] ) ]
{ LANGUAGE lang_name
| TRANSFORM { FOR TYPE type_name } [, ... ]
| WINDOW
| { IMMUTABLE | STABLE | VOLATILE }
| [ NOT ] LEAKPROOF
| { CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }
| { [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER }
| PARALLEL { UNSAFE | RESTRICTED | SAFE }
| COST execution_cost
| ROWS result_rows
| SUPPORT support_function
| SET configuration_parameter { TO value | = value | FROM CURRENT }
| AS 'definition'
| AS 'obj_file', 'link_symbol'
| sql_body
} ...
Increment an integer, making use of an argument name, in PL/pgSQL:
CREATE OR REPLACE FUNCTION increment(i integer) RETURNS integer AS $$
BEGIN
RETURN i + 1;
END;
$$ LANGUAGE plpgsql;
Return a record containing multiple output parameters:
CREATE FUNCTION dup(in int, out f1 int, out f2 text)
AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
LANGUAGE SQL;
SELECT * FROM dup(42);
security option
security 옵션은 다음과 같다.
- 함수 생성자가 아닌 호출자 권한으로 수행 - security invoker (디폴트)
- 함수 생성자 권한으로 수행 - security definer
Example:
-- 3. Create security definer function, which should be run as "postgres"
create function private.get_teams_for_authenticated_user()
returns setof bigint
language sql
security definer -- 실행 권한을 실행한 측이 아닌 함수 정의한 측(definer)로 지정.
set search_path = public -- 검색 경로 'public' schema 로 제한
stable -- 내용을 수정하지 않는다.
as $$
select team_id
from members
where user_id = auth.uid()
$$;