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
$$
;
์ผ๋ฐ ์ฌ์ฉยถ
SQL UDF๋ ์์์ SQL ์์ ํ๊ฐํ๊ณ ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
ํจ์ ์ ์๋ ์ค์นผ๋ผ(์ฆ, ๋จ์ผ) ๊ฐ์ ๋ฐํํ๊ฑฐ๋, ํ ์ด๋ธ ํจ์๋ก ์ ์๋ ๊ฒฝ์ฐ ํ ์ธํธ๋ฅผ ๋ฐํํ๋ SQL ์์ผ ์ ์์ต๋๋ค.
SQL UDFs ๋ณด์/๊ถํ ์๊ตฌ ์ฌํญยถ
์ ๊ทํ๋์ง ์์ ํ ์ด๋ธ์ ํจ์ ์ ์๊ฐ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ, ํด๋น ํ ์ด๋ธ์ ํจ์๋ฅผ ํฌํจํ๋ ์คํค๋ง์์ ํ์ธ๋ฉ๋๋ค. ๋ค๋ฅธ ์คํค๋ง ์ค๋ธ์ ํธ(์: ํ ์ด๋ธ, ๋ทฐ ๋๋ ๊ธฐํ ํจ์)์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ํด์๋ ํจ์ ์์ ์์๊ฒ ํด๋น ์คํค๋ง ์ค๋ธ์ ํธ์ ์ก์ธ์คํ ๊ถํ์ด ์์ด์ผ ํฉ๋๋ค. ํจ์ ํธ์ถ์๋ ํจ์ ์ ์์์ ์ฐธ์กฐ๋๋ ์ค๋ธ์ ํธ์ ์ก์ธ์คํ ๊ถํ์ ๊ฐ์ง ํ์๊ฐ ์์ผ๋ฉฐ, ํจ์๋ฅผ ์ฌ์ฉํ ๊ถํ๋ง ์์ผ๋ฉด ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๊ด๋ฆฌ์๋ ์ผ๋ฐ์ ์ผ๋ก ์ก์ธ์คํ ์ ์๋ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ users
๋ผ๋ ํ
์ด๋ธ์ ์์ ํ๊ณ ์์ง๋ง, ์ด ๊ด๋ฆฌ์๋ ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ์ก์ธ์ค ๊ถํ์ ๊ฐ์ง๊ณ ์๋ ํจ์๋ฅผ ํตํด ์ด ์ฌ์ฉ์ ์๋ฅผ ๊ณต๊ฐํ ์ ์์ต๋๋ค.
USE ROLE dataadmin;
DESC TABLE users;
+-----------+--------------+--------+-------+---------+-------------+------------+--------+------------+---------+
| 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;
FAILURE: SQL compilation error:
Object 'USERS' does not exist.
-- However, this will succeed.
SELECT total_user_count();
+--------------------+
| TOTAL_USER_COUNT() |
|--------------------+
| 123 |
+--------------------+
์ญํ ๋ฐ ๊ถํ์ ์ฌ์ฉํ์ฌ ์ก์ธ์ค ์ ์ด๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ก์ธ์ค ์ ์ด์ ๊ฐ์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.