SQL UDFs 简介

可以使用 SQL 编写用户定义函数 (UDF) 的处理程序。本部分中的主题描述如何设计和编写 SQL 处理程序。您还会发现一些例子。

有关 UDFs 的介绍,包括可用于编写 UDF 处理程序的语言列表,请参阅 用户定义函数概述

有了处理程序后,就可以用 SQL 创建 UDF。有关使用 SQL 创建或调用 UDF 的信息,请参阅 创建 UDF调用 UDF

备注

要了解与 SQL UDF 处理程序相关的限制,请参阅 SQL UDF 限制

本主题内容:

SQL 处理程序的工作原理

当用户调用 UDF 时,用户将 UDF 的名称和实参传递给 Snowflake。Snowflake 调用相关处理程序代码(如有实参则使用实参)来执行 UDF 的逻辑。然后,处理程序方法将输出返回给 Snowflake,Snowflake 再将其传回给客户端。

函数定义可以是 SQL 表达式,该表达式返回一个标量(即单个)值,或者如果定义为表函数,则返回一组行。

示例

以下示例中的代码创建一个名为 area_of_circle 的 UDF,该函数包含处理程序代码,可根据作为实参的 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;

+-----------+--------------+--------+-------+---------+-------------+------------+--------+------------+---------+
| 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                |
+--------------------+
Copy

有关使用角色和权限来管理访问控制的更多信息,请参阅 访问控制概述

语言: 中文