SQL UDF ์†Œ๊ฐœยถ

SQL์—์„œ UDF(์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜)์˜ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„น์…˜์˜ ํ•ญ๋ชฉ์—์„œ๋Š” SQL ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ๋„ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

UDF ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด ๋ชฉ๋ก์„ ํฌํ•จํ•˜์—ฌ, UDF์— ๋Œ€ํ•œ ์†Œ๊ฐœ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ ๊ฐœ์š” ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ์žˆ์œผ๋ฉด SQL๋กœ UDF๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. SQL์„ ์‚ฌ์šฉํ•˜์—ฌ UDF์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ ์ƒ์„ฑํ•˜๊ธฐ ๋˜๋Š” UDF ์‹คํ–‰ํ•˜๊ธฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ฐธ๊ณ 

SQL UDF ์ฒ˜๋ฆฌ๊ธฐ์™€ ๊ด€๋ จ๋œ ์ œํ•œ ์‚ฌํ•ญ์€ SQL UDF ์ œํ•œ ์‚ฌํ•ญ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ด ํ•ญ๋ชฉ์˜ ๋‚ด์šฉ:

SQL ์ฒ˜๋ฆฌ๊ธฐ ์ž‘๋™ ๋ฐฉ์‹ยถ

์‚ฌ์šฉ์ž๋Š” UDF๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ UDF์˜ ์ด๋ฆ„๊ณผ ์ธ์ž๋ฅผ Snowflake์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. Snowflake๋Š” UDF์˜ ๋…ผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๊ด€๋ จ ์ฒ˜๋ฆฌ๊ธฐ ์ฝ”๋“œ(์ธ์ž๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์ธ์ž๋„ ํฌํ•จ)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ธ๋“ค๋Ÿฌ ๋ฉ”์„œ๋“œ๋Š” ์ถœ๋ ฅ์„ Snowflake๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ  Snowflake๋Š” ์ด๋ฅผ ๋‹ค์‹œ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ์ •์˜๋Š” ์Šค์นผ๋ผ(์ฆ‰, ๋‹จ์ผ) ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜, ํ…Œ์ด๋ธ” ํ•จ์ˆ˜๋กœ ์ •์˜๋œ ๊ฒฝ์šฐ ํ–‰ ์„ธํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” SQL ์‹์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆยถ

๋‹ค์Œ ์˜ˆ์ œ์˜ ์ฝ”๋“œ๋Š” UDF์—์„œ ์ธ์ž๋กœ ๋ฐ›์€ ๋ฐ˜์ง€๋ฆ„ ๊ฐ’์—์„œ ์›์˜ ๋ฉด์ ์„ ๊ณ„์‚ฐํ•˜๋Š” ์ฒ˜๋ฆฌ๊ธฐ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” area_of_circle ์ด๋ผ๋Š” UDF๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

CREATE FUNCTION area_of_circle(radius FLOAT)
  RETURNS FLOAT
  AS
  $$
    pi() * radius * radius
  $$
  ;
Copy

์ผ๋ฐ˜ ์‚ฌ์šฉยถ

SQL UDF๋Š” ์ž„์˜์˜ SQL ์‹์„ ํ‰๊ฐ€ํ•˜๊ณ  ์‹์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ์ •์˜๋Š” ์Šค์นผ๋ผ(์ฆ‰, ๋‹จ์ผ) ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜, ํ…Œ์ด๋ธ” ํ•จ์ˆ˜๋กœ ์ •์˜๋œ ๊ฒฝ์šฐ ํ–‰ ์„ธํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” SQL ์‹์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SQL UDFs ๋ณด์•ˆ/๊ถŒํ•œ ์š”๊ตฌ ์‚ฌํ•ญยถ

์ •๊ทœํ™”๋˜์ง€ ์•Š์€ ํ…Œ์ด๋ธ”์„ ํ•จ์ˆ˜ ์ •์˜๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ํ…Œ์ด๋ธ”์€ ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” ์Šคํ‚ค๋งˆ์—์„œ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šคํ‚ค๋งˆ ์˜ค๋ธŒ์ ํŠธ(์˜ˆ: ํ…Œ์ด๋ธ”, ๋ทฐ ๋˜๋Š” ๊ธฐํƒ€ ํ•จ์ˆ˜)์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์œ„ํ•ด์„œ๋Š” ํ•จ์ˆ˜ ์†Œ์œ ์ž์—๊ฒŒ ํ•ด๋‹น ์Šคํ‚ค๋งˆ ์˜ค๋ธŒ์ ํŠธ์— ์•ก์„ธ์Šคํ•  ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ์ž๋Š” ํ•จ์ˆ˜ ์ •์˜์—์„œ ์ฐธ์กฐ๋˜๋Š” ์˜ค๋ธŒ์ ํŠธ์— ์•ก์„ธ์Šคํ•  ๊ถŒํ•œ์„ ๊ฐ€์งˆ ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๊ถŒํ•œ๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ด€๋ฆฌ์ž๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋Š” ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ users ๋ผ๋Š” ํ…Œ์ด๋ธ”์„ ์†Œ์œ ํ•˜๊ณ  ์žˆ์ง€๋งŒ, ์ด ๊ด€๋ฆฌ์ž๋Š” ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ด ์‚ฌ์šฉ์ž ์ˆ˜๋ฅผ ๊ณต๊ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

USE ROLE dataadmin;

DESC TABLE users;
Copy
+-----------+--------------+--------+-------+---------+-------------+------------+--------+------------+---------+
| name      | type         | kind   | null? | default | primary key | unique key | check  | expression | comment |
|-----------+--------------+--------+-------+---------+-------------+------------+--------+------------+---------|
| USER_ID   | NUMBER(38,0) | COLUMN | Y     | [NULL]  | N           | N          | [NULL] | [NULL]     | [NULL]  |
| USER_NAME | VARCHAR(100) | COLUMN | Y     | [NULL]  | N           | N          | [NULL] | [NULL]     | [NULL]  |
  ...
  ...
  ...
+-----------+--------------+--------+-------+---------+-------------+------------+--------+------------+---------+
CREATE FUNCTION total_user_count() RETURNS NUMBER AS 'select count(*) from users';

GRANT USAGE ON FUNCTION total_user_count() TO ROLE analyst;

USE ROLE analyst;

-- This will fail because the role named "analyst" does not have the
-- privileges required in order to access the table named "users".
SELECT * FROM users;
Copy
FAILURE: SQL compilation error:
Object 'USERS' does not exist.
-- However, this will succeed.
SELECT total_user_count();
Copy
+--------------------+
| TOTAL_USER_COUNT() |
|--------------------+
| 123                |
+--------------------+

์—ญํ•  ๋ฐ ๊ถŒํ•œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šค ์ œ์–ด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•ก์„ธ์Šค ์ œ์–ด์˜ ๊ฐœ์š” ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.