Einführung in SQL-UDFs

Sie können den Handler für eine benutzerdefinierte Funktion (UDF) in SQL schreiben. Unter den Themen in diesem Abschnitt wird beschrieben, wie Sie einen SQL-Handler entwerfen und schreiben. Außerdem werden Beispiele bereitgestellt.

Eine Einführung in UDFs, einschließlich einer Liste der Sprachen, in denen Sie einen UDF-Handler schreiben können, finden Sie unter Übersicht zu benutzerdefinierten Funktionen.

Sobald der Handler verfügbar ist, erstellen Sie die UDF mit SQL. Weitere Informationen zur Verwendung von SQL für das Erstellen oder Aufrufen einer UDF finden Sie unter Erstellen einer UDF bzw. Aufrufen einer UDF.

Bemerkung

Informationen zu Einschränkungen bezüglich SQL-UDF-Handlern finden Sie unter SQL-UDF-Einschränkungen.

Unter diesem Thema:

Funktionsweise eines SQL-Handlers

Wenn ein Benutzer eine UDF aufruft, übergibt der Benutzer den Namen und die Argumente der UDF an Snowflake. Snowflake ruft den zugehörigen Handler-Code (ggf. mit Argumenten) auf, um die Verarbeitungslogik der UDF auszuführen. Die Handler-Methode gibt dann die Ausgabe an Snowflake zurück, und Snowflake gibt die Ausgabe an den Client zurückgibt.

Die Funktionsdefinition kann ein SQL-Ausdruck sein, der entweder einen skalaren (d. h. einen einzelnen) Wert oder, wenn als Tabellenfunktion definiert, einen Satz von Zeilen zurückgibt.

Beispiel

Der Code im folgenden Beispiel erstellt eine UDF mit dem Namen area_of_circle, die Handler-Code enthält, mit dem die Fläche eines Kreises aus dem Radiuswert berechnet wird, den die UDF als Argument erhält.

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

Allgemeine Nutzung

Eine SQL-UDF wertet einen beliebigen SQL-Ausdruck aus und gibt die Ergebnisse des Ausdrucks zurück.

Die Funktionsdefinition kann ein SQL-Ausdruck sein, der entweder einen skalaren (d. h. einen einzelnen) Wert oder, wenn als Tabellenfunktion definiert, einen Satz von Zeilen zurückgibt.

Sicherheits-/Berechtigungsanforderungen für SQL-UDFs

Wenn sich eine Funktionsdefinition auf eine nicht qualifizierte Tabelle bezieht, wird diese Tabelle in dem Schema aufgelöst, das die Funktion enthält. Ein Verweis auf ein anderes Schemaobjekt (z. B. Tabelle, Ansicht oder andere Funktion) erfordert, dass der Eigentümer der Funktion über Berechtigungen zum Zugriff auf dieses Schemaobjekt verfügt. Der Aufrufer der Funktion muss keinen Zugriff auf die Objekte haben, auf die in der Funktionsdefinition verwiesen wird, sondern nur die Berechtigung zur Verwendung der Funktion.

Ein Administrator besitzt beispielsweise eine Tabelle mit dem Namen users, die vertrauliche Daten enthält, auf die allgemein nicht zugegriffen werden kann. Der Administrator kann jedoch die Gesamtzahl der Benutzer über eine Funktion verfügbar machen, für die andere Benutzer Zugriffsrechte haben:

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

Weitere Informationen zur Verwendung von Rollen und Berechtigungen zum Verwalten der Zugriffssteuerung finden Sie unter Übersicht zur Zugriffssteuerung.