- Kategorien:
GET_DDL¶
Gibt eine DDL-Anweisung zurück, mit der sich das angegebene Objekt neu erstellen lässt. Bei Datenbanken und Schemas ist GET_DDL rekursiv (d. h. es werden die DDL-Anweisungen zur Neuerstellung aller unterstützten Objekte in der angegebenen Datenbank/im angegebenen Schema zurückgegeben).
GET_DDL unterstützt derzeit folgende Objekttypen:
Alerts (siehe CREATE ALERT)
Datenbanken (siehe CREATE DATABASE)
Dynamische Tabellen (siehe CREATE DYNAMIC TABLE)
Ereignistabellen (siehe CREATE EVENT TABLE)
Externe Tabellen (siehe CREATE EXTERNAL TABLE)
Dateiformate (siehe CREATE FILE FORMAT)
Iceberg-Tabellen (siehe CREATE ICEBERG TABLE)
Pipes (siehe CREATE PIPE)
Richtlinien (siehe CREATE AGGREGATION POLICY, CREATE AUTHENTICATION POLICY, CREATE MASKING POLICY, CREATE PASSWORD POLICY, CREATE PROJECTION POLICY, CREATE ROW ACCESS POLICY, CREATE SESSION POLICY)
Schemas (siehe CREATE SCHEMA)
Sequenzen (siehe CREATE SEQUENCE)
Gespeicherte Prozeduren (siehe CREATE PROCEDURE)
Streams (siehe CREATE STREAM)
Tabellen (siehe CREATE TABLE)
Tags (siehe CREATE TAG)
Aufgaben (siehe CREATE TASK)
UDFs, einschließlich externer Funktionen (siehe CREATE FUNCTION).
Ansichten (siehe CREATE VIEW)
Syntax¶
GET_DDL( '<object_type>' , '[<namespace>.]<object_name>' [ , <use_fully_qualified_names_for_recreated_objects> ] )
Argumente¶
Erforderlich:
object_type
Gibt den Objekttyp an, für den die DDL zurückgegeben wird. Gültige Werte (entsprechend den unterstützten Objekttypen) sind:
DATABASE
DYNAMIC_TABLE
EVENT_TABLE
FILE_FORMAT
FUNCTION (für UDFs, einschließlich externer Funktionen)
ICEBERG_TABLE
PIPE
POLICY (Aggregations-, Authentifizierungs-, Maskierungs-, Kennwort-, Projektions-, Zeilenzugriffs- und Sitzungsrichtlinien)
PROCEDURE (für gespeicherte Prozeduren)
SCHEMA
SEQUENCE
STREAM
TABLE (auch für externe Tabellen)
TAG (Objekt-Tagging)
TASK
VIEW (einschließlich für materialisierte Ansichten)
namespace.object_name
Gibt den vollqualifizierten Namen des Objekts an, für das die DDL zurückgegeben wird.
Namespace ist die Datenbank und/oder das Schema, in der bzw. dem sich das Objekt befindet:
Wird nicht für Datenbanken genutzt.
Bei Schemas liegt die Form
database
vor.Für Schemaobjekte (Tabellen, Ansichten, Streams, Aufgaben, Sequenzen, Dateiformate, Pipes, Richtlinien und UDFs) wird
database.schema
oderschema
verwendet.
Namespace ist optional, wenn in der Benutzersitzung aktuell eine Datenbank und ein Schema verwendet werden. Andernfalls ist er erforderlich.
Optional:
use_fully_qualified_names_for_recreated_objects
Bei
TRUE
werden in den generierten DDL-Anweisungen vollqualifizierte Namen für die neu zu erstellenden Objekte verwendet.Standard:
FALSE
.Bemerkung
Dies hat keine Auswirkungen auf die Namen anderer Objekte, auf die in der DDL-Anweisung verwiesen wird (z. B. den Namen einer Tabelle, auf die in einer Ansichtsdefinition verwiesen wird).
Rückgabewerte¶
Gibt eine Zeichenfolge (VARCHAR
) zurück, die den Text der DDL-Anweisung enthält, mit der das Objekt erstellt wurde.
Bei UDFs und gespeicherten Prozeduren kann sich die Ausgabe geringfügig von der ursprünglichen DDL unterscheiden. Wenn beispielsweise die UDF oder die gespeicherte Prozedur JavaScript-Code enthält, können sich die Trennzeichen um den JavaScript-Code unterscheiden. Wenn in der ursprünglichen CREATE PROCEDURE
-Anweisung weder EXECUTE AS OWNER
noch EXECUTE AS CALLER
angegeben wurden, enthält die Ausgabe von GET_DDL
auch EXECUTE AS OWNER
, da dies die Standardeinstellung ist.
Nutzungshinweise¶
Die folgenden Hinweise gelten für alle unterstützten Objekte:
object_type
undobject_name
(einschließlichnamespace
, falls angegeben) müssen in einfache Anführungszeichen gesetzt werden.Für
object_type
sind die ObjekttypwerteTABLE
undVIEW
austauschbar. Wenn einTABLE
-Objekttyp angegeben und das per Name festgelegte Objekt eine Ansicht ist, gibt die Funktion die DDL für die Ansicht zurück und umgekehrt.Wenn
object_type
den ObjetkttypwertFUNCTION
(d. h. UDF) hat und die UDF Argumente aufweist, müssen Sie die Argumentdatentypen als Teil des Funktionsnamens im Format'function_name( [ arg_data_type [ , ... ] ] )'
einschließen, wobeifunction_name
der Funktionsname undarg_data_type
der Datentyp des Arguments ist.Wenn
object_type
den ObjekttypwertPROCEDURE
hat und die gespeicherte Prozedur Argumente aufweist, müssen Sie die Argumentdatentypen als Teil des Funktionsnamens einschließen, und zwar im Format'procedure_name( [ arg_data_type [ , ... ] ] )'
, wobei „procedure_name“ der Name der Prozedur und „arg_data_type“ der Datentyp des Arguments ist.Wenn Sie ein
TABLE
-Objekt angeben, das eine Iceberg-Tabelle ist, gibt die Funktion die DDL für die Iceberg-Tabelle zurück.Das Abfragen dieser Funktion erfordert bei den meisten Snowflake-Objekttypen die gleichen Mindestberechtigungen, die zum Anzeigen des Objekts erforderlich sind (mit DESCRIBE <Objekt> oder SHOW <Objekte>). Snowflake beschränkt die Anzeige spezieller Objekte wie z. B. sicherer Ansichten auf den Eigentümer (d. h. die Rolle mit der Berechtigung OWNERSHIP für das Objekt).
Die folgenden Hinweise beziehen sich auf Ansichtsobjekte:
Für das Abfrageergebnis gilt immer Folgendes:
Gibt SQL-Text in Kleinbuchstaben für
create or replace view
zurück, auch wenn in der ursprünglichen SQL-Anweisung, die zum Erstellen der Ansicht verwendet wurde, Großschreibung oder gemischte Klein-/Großschreibung verwendet wurde.Enthält die
OR REPLACE
-Klausel.Enthält die Eigenschaft
SECURE
, wenn die Ansicht sicher ist.Schließt den Ansichtsparameter
COPY GRANTS
aus, auch wenn die ursprüngliche CREATE VIEW-Anweisung den ParameterCOPY GRANTS
angibt.Generiert die Spaltenliste.
Wenn auf einer Spalte eine Maskierungsrichtlinie festgelegt ist, gibt das Ergebnis die Maskierungsrichtlinie für die Spalte an.
Entfernt SQL-Kommentare vor dem Ansichtstext (d. h.
AS
). Im folgenden Code wird zum Beispiel der Kommentar unmittelbar vor der AS-Klausel entfernt:create view view_t1 -- GET_DDL() removes this comment. AS select * from t1;
Die folgenden Hinweise gelten speziell für Tabellen- und Ansichtsobjekte mit einem Tag oder einer Richtlinie:
Die Rolle, die die GET_DDL-Abfrage ausführt, muss die globale APPLY MASKING POLICY-, APPLY ROW ACCESS POLICY-, APPLY AGGREGATION POLICY- oder APPLY PROJECTION POLICY- oder APPLY TAG-Berechtigung sowie die USAGE-Berechtigung für die Datenbank und das Schema haben, die die Richtlinie oder das Tag enthalten. Andernfalls ersetzt Snowflake die Richtlinie durch
#UNKNOWN_POLICY
und das Tag durch#UNKNOWN_TAG='#UNKNOWN_VALUE
. Dieser Text zeigt an, dass die Spalte oder das Objekt durch eine Richtlinie geschützt ist und ein Tag auf das Objekt bzw. die Spalte gesetzt ist. Wenn dieser Text nicht vor der Neuerstellung des Objekts entfernt wird, schlägt die CREATE OR REPLACE <Objekt>-Anweisung fehl.Wenn das Ergebnis der GET_DDL-Abfrage diesen Text enthält, wenden Sie sich vor der Neuerstellung der Ansicht an Ihren internen Governance-Administrator, um festzustellen, welche Richtlinien und Tags für die Spalten bzw. das Objekt erforderlich sind. Bearbeiten Sie schließlich das Abfrageergebnis von GET_DDL, und erstellen Sie das Objekt neu.
Ohne die genannten Berechtigungen gibt diese Tabellenfunktion in der Ausgabe des Funktionsaufrufs nicht die entsprechende Zeile der Richtlinien- und Tag-Zuweisungen zurück.
Wenn für ein Objekt oder eine Spalte mehrere Tags gesetzt sind, sortiert die GET_DDL-Ausgabe die Tags alphabetisch nach dem Tag-Namen.
Durch das Löschen eines Tags wird das Tag aus der GET_DDL-Ausgabe entfernt.
Wenn ein Tag auf der Tabelle oder Ansicht gesetzt ist, enthält die GET_DDL-Ausgabe der Tabelle oder Ansicht die Tag-Zuweisungen in der CREATE OR REPLACE-Anweisung.
Wenn eine Maskierungsrichtlinie für die Spalte oder eine Zeilenzugriffsrichtlinie für die Tabelle festgelegt ist, enthält die GET_DDL-Ausgabe die Richtlinienzuweisungen mit dem Schlüsselwort
WITH
.
Wenn ein Tag auf der Datenbank oder auf dem Schema gesetzt ist, enthält die GET_DDL-Ausgabe Folgendes:
Eine ALTER DATABASE-Anweisung, wenn das Tag auf der Datenbank gesetzt ist.
Eine ALTER DATABASE-Anweisung und eine ALTER SCHEMA-Anweisung, wenn das Tag sowohl auf der Datenbank als auch auf dem Schema gesetzt ist.
Eine ALTER SCHEMA-Anweisung, wenn das Tag auf dem Schema gesetzt ist.
Eine CREATE OR REPLACE-Anweisung, um das Tag zu generieren, wenn das Tag in der Datenbank oder im Schema vorhanden ist.
Sortierungsdetails¶
Collation information is included in the input.
Beispiele¶
Zurückgeben der DDL, die zum Erstellen einer Ansicht namens books_view
verwendet wurde:
select get_ddl('view', 'books_view'); +-----------------------------------------------------------------------------+ | GET_DDL('VIEW', 'BOOKS_VIEW') | |-----------------------------------------------------------------------------| | | | create or replace view BOOKS_VIEW as select title, author from books_table; | | | +-----------------------------------------------------------------------------+
Zurückgeben der DDL, die zum Erstellen eines Schemas mit dem Namen books_schema
und der Objekte im Schema (die Tabelle books_table
und die Ansicht books_view
) verwendet wurde:
select get_ddl('schema', 'books_schema'); +-----------------------------------------------------------------------------+ | GET_DDL('SCHEMA', 'BOOKS_SCHEMA') | |-----------------------------------------------------------------------------| | create or replace schema BOOKS_SCHEMA; | | | | create or replace TABLE BOOKS_TABLE ( | | ID NUMBER(38,0), | | TITLE VARCHAR(255), | | AUTHOR VARCHAR(255) | | ); | | | | create or replace view BOOKS_VIEW as select title, author from books_table; | | | +-----------------------------------------------------------------------------+
Zurückgeben der DDL, die vollqualifizierte Namen für die neu zu erstellenden Objekte verwendet:
select get_ddl('schema', 'books_schema', true); +---------------------------------------------------------------------------------------------------+ | GET_DDL('SCHEMA', 'BOOKS_SCHEMA', TRUE) | |---------------------------------------------------------------------------------------------------| | create or replace schema BOOKS_DB.BOOKS_SCHEMA; | | | | create or replace TABLE BOOKS_DB.BOOKS_SCHEMA.BOOKS_TABLE ( | | ID NUMBER(38,0), | | TITLE VARCHAR(255), | | AUTHOR VARCHAR(255) | | ); | | | | create or replace view BOOKS_DB.BOOKS_SCHEMA.BOOKS_VIEW as select title, author from books_table; | | | +---------------------------------------------------------------------------------------------------+
Bemerkung
Wie im obigen Beispiel gezeigt, verwendet die DDL-Anweisung keinen vollqualifizierten Namen für die Tabelle, die zum Erstellen der Ansicht verwendet wird. Um den Namen dieser Tabelle aufzulösen, verwendet Snowflake den Namen der Datenbank und den Namen des Schemas dieser Ansicht.
Zurückgeben der DDL, die zum Erstellen einer UDF mit dem Namen multiply
verwendet wurde, die zwei Parameter vom Typ NUMBER
enthält:
select get_ddl('function', 'multiply(number, number)'); --------------------------------------------------+ GET_DDL('FUNCTION', 'MULTIPLY(NUMBER, NUMBER)') | --------------------------------------------------+ CREATE OR REPLACE "MULTIPLY"(A NUMBER, B NUMBER) | RETURNS NUMBER(38,0) | COMMENT='multiply two numbers' | AS 'a * b'; | --------------------------------------------------+
Zurückgeben der DDL, die zum Erstellen einer gespeicherten Prozedur mit dem Namen stproc_1
verwendet wurde, die einen Parameter vom Typ FLOAT
aufweist:
SELECT GET_DDL('procedure', 'stproc_1(float)'); +---------------------------------------------------+ | GET_DDL('PROCEDURE', 'STPROC_1(FLOAT)') | |---------------------------------------------------| | CREATE OR REPLACE PROCEDURE "STPROC_1"("F" FLOAT) | | RETURNS FLOAT | | LANGUAGE JAVASCRIPT | | EXECUTE AS OWNER | | AS ' | | ''return F;'' | | '; | +---------------------------------------------------+
Geben Sie die DDL zurück, um eine Maskierungsrichtlinie namens employee_ssn_mask
zur Maskierung von Sozialversicherungsnummern zu erstellen. Maskierte Werte werden angezeigt, es sei denn, die aktuelle Rolle des Benutzers ist PAYROLL.
select get_ddl('policy', 'employee_ssn_mask'); ---------------------------------------------------------------------------+ GET_DDL('POLICY', 'EMPLOYEE_SSN_MASK') | ---------------------------------------------------------------------------+ create masking policy employee_ssn_mask as (val string) returns string -> | case | when current_role() in ('PAYROLL') | then val | else '******' | end; | ---------------------------------------------------------------------------+