Referenz für benutzerdefinierte Clean Room-Vorlagen

Über Clean Room-Vorlagen

Clean room templates are written in JinjaSQL. JinjaSQL is an extension to the Jinja templating language that generates a SQL query as output. This allows templates to use logic statements and run-time variable resolution to let the user specify table names, table columns, and custom values used in the query at run time.

Snowflake provides some pre-designed templates for common use cases. However, most users prefer to create custom query templates for their clean rooms. Custom templates are created using the clean rooms API, but can be run either in code or using the clean rooms UI.

Es gibt zwei allgemeine Vorlagentypen:

  • Analysis templates, which evaluate to a SELECT statement (or a set of SELECT operations) that show results to the template runner.

  • Activation templates, which are used to activate results to a Snowflake account or a third-party, rather than showing results in the immediate environment. An activation template is very similar to an analysis template with a few extra requirements.

    In the clean rooms UI, an analysis template can be associated with an activation template to enable the caller to run an analysis, see results, and then activate data to themselves or a third party. The activation template does not need to resolve to the same query as the associated analysis template.

Benutzerdefinierte Vorlage erstellen und ausführen

In a clean room with default settings, the provider adds a template to a clean room and the consumer runs the template, as described in the custom template usage documentation.

Ein kurzes Beispiel

Hier ist ein einfaches SQL-Beispiel, das eine Anbieter- und eine Verbrauchertabelle nach E-Mail verknüpft und die Anzahl der Überlappungen pro Stadt anzeigt:

SELECT COUNT(*), city FROM consumer_table
  INNER consumer_table
  ON consumer_table.hashed_email = provider_table.hashed_email
  GROUP BY city;
Copy

Here is how that query would look as a JinjaSQL template that allows the caller to choose the JOIN and GROUP BY columns, as well as the tables used:

SELECT COUNT(*), IDENTIFIER({{ group_by_col | column_policy }})
  FROM IDENTIFIER({{ my_table[0] }}) AS c
  INNER JOIN IDENTIFIER({{ source_table[0] }}) AS p
  ON IDENTIFIER({{ consumer_join_col | join_policy }}) = IDENTIFIER({{ provider_join_col | join_policy }})
  GROUP BY IDENTIFIER({{ group_by_col | column_policy }});
Copy

Anmerkungen zur Vorlage:

  • Werte innerhalb von {{ double bracket pairs }} sind benutzerdefinierte Variablen. group_by_col, my_table, source_table, consumer_join_col, provider_join_col und group_by_col sind alle benutzerdefinierten Variablen, die vom Aufrufer eingegeben werden.

  • source_table und my_table sind von Snowflake definierte Zeichenfolgen-Array-Variablen, die vom Aufrufer aufgefüllt werden. Array-Mitglieder sind vollqualifizierte Namen von Anbieter- und Verbrauchertabellen, die mit dem Clean Room verknüpft sind. Der Aufrufer gibt an, welche Tabellen in jedes Array aufgenommen werden sollen.

  • Provider tables must be aliased as lowercase p and consumer tables as lowercase c in a template. If you have multiple tables, you can index them as p1, p2, c1, c2, and so on.

  • IDENTIFIER wird für alle Spalten- und Tabellennamen benötigt, da Variablen in {{ double brackets }} als Zeichenfolgenliterale ausgewertet werden, die keine gültigen Bezeichner sind.

  • JinjaSQL filters can be applied to variables to enforce any join or column policies set by either side. Snowflake implements custom filters join_policy and column_policy, which verify whether a column complies with join or column policies in the clean room respectively, and fail the query if it does not. A filter is applied to a column name as {{ column_name | filter_name }}.

All diese Punkte werden wir später im Detail besprechen.

Hier sehen Sie, wie ein Verbraucher diese Vorlage im Code ausführen könnte. Beachten Sie, wie die Spaltennamen durch die in der Vorlage deklarierten Tabellen-Aliasse qualifiziert werden.

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.CONSUMER.RUN_ANALYSIS(
  $cleanroom_name,
  $template_name,
  ['my_db.my_sch.consumer_table],       -- Populates the my_table variable
  ['my_db.my_sch.provider_table'],      -- Populates the source_table variable
  OBJECT_CONSTRUCT(                     -- Populates custom named variables
    'consumer_join_col','c.age_band',
    'provider_join_col','p.age_band',
    'group_by_col','p.device_type'
  )
);
Copy

To be able to use this template in the clean rooms UI, the provider must create a custom UI form for the template. The UI form has named form elements that correspond to template variable names, and the values provided in the form are passed into the template.

Entwickeln einer benutzerdefinierten Vorlage

Clean Room-Vorlagen sind JinjaSQL-Vorlagen. Um eine -Vorlage zu erstellen, sollten Sie mit den folgenden Themen vertraut sein:

Use the consumer.get_jinja_sql procedure to test the validity of your template, then run the rendered template to see that it produces the results that you expect. Note that this procedure doesn’t support clean room filter extensions, such as join_policy, so you must test your template without those filters, and add them later.

Beispiel:

-- Template to test
SELECT {{ col1 | sqlsafe }}, {{ col2 | sqlsafe }}
  FROM IDENTIFIER({{ source_table[0] }}) AS p
  JOIN IDENTIFIER({{ my_table[0] }}) AS c
  ON {{ provider_join_col | sqlsafe }} = {{ consumer_join_col | sqlsafe}}
  {% if where_phrase %} WHERE {{ where_phrase | sqlsafe}}{% endif %};

-- Render the template.
USE WAREHOUSE app_wh;
USE ROLE SAMOOHA_APP_ROLE;

CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.CONSUMER.GET_SQL_JINJA(
$$
SELECT {{ col1 | sqlsafe }}, {{ col2 | sqlsafe }}
  FROM IDENTIFIER({{ source_table[0] }}) AS p
  JOIN IDENTIFIER({{ my_table[0] }}) AS c
  ON IDENTIFIER({{ provider_join_col }}) = IDENTIFIER({{ consumer_join_col }})
  {% if where_phrase %} WHERE {{ where_phrase | sqlsafe }}{% endif %};
  $$,
  object_construct(
'col1', 'c.status',
'col2', 'c.age_band',
'where_phrase', 'p.household_size > 2',
'consumer_join_col', 'c.age_band',
'provider_join_col', 'p.age_band',
'source_table', ['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS'],
'my_table', ['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS']
));
Copy

Die gerenderte Vorlage sieht wie folgt aus:

SELECT c.status, c.age_band
  FROM IDENTIFIER('SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS') AS p
  JOIN IDENTIFIER('SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS') AS c
  ON p.age_band = c.age_band
  WHERE p.household_size > 2;

Versuchen Sie, die obige SQL-Anweisung in Ihrer Umgebung auszuführen, um zu sehen, ob sie funktioniert und die erwarteten Ergebnisse liefert.

Dann testen Sie Ihre Vorlage ohne WHERE-Klausel:

-- Render the template without a WHERE clause
CALL SAMOOHA_BY_SNOWFLAKE_LOCAL_DB.CONSUMER.GET_SQL_JINJA(
$$
SELECT {{ col1 | sqlsafe }}, {{ col2 | sqlsafe }}
  FROM IDENTIFIER({{ source_table[0] }}) AS p
  JOIN IDENTIFIER({{ my_table[0] }}) AS c
  ON {{ provider_join_col | sqlsafe }} = {{ consumer_join_col | sqlsafe}}
  {% if where_phrase %} WHERE {{ where_phrase | sqlsafe }}{% endif %};
  $$,
  object_construct(
'col1', 'c.status',
'col2', 'c.age_band',
'consumer_join_col', 'c.age_band',
'provider_join_col', 'p.age_band',
'source_table', ['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS'],
'my_table', ['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS']
));
Copy

Gerenderte Vorlage:

SELECT c.status, c.age_band
  FROM IDENTIFIER('SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS') AS p
  JOIN IDENTIFIER('SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS') AS c
  ON p.age_band = c.age_band
  ;

Fügen Sie die Richtlinienfilter zur Vorlage hinzu, und fügen Sie die Vorlage zu Ihrem Clean Room hinzu:

CALL samooha_by_snowflake_local_db.provider.add_custom_sql_template(
    $cleanroom_name,
    'simple_template',
    $$
    SELECT {{ col1 | sqlsafe | column_policy }}, {{ col2 | sqlsafe | column_policy }}
      FROM IDENTIFIER({{ source_table[0] }}) AS p
      JOIN IDENTIFIER({{ my_table[0] }}) AS c
      ON {{ provider_join_col | sqlsafe | join_policy }} = {{ consumer_join_col | sqlsafe | join_policy }}
      {% if where_phrase %} WHERE {{ where_phrase | sqlsafe }}{% endif %};
    $$,
);
Copy

Datenschutz

Vorlagen können nur auf Datensätze zugreifen, die vom Anbieter und vom Verbraucher mit dem Clean Room verknüpft wurden.

Both the provider and consumer can set join, column, and activation policies on their data to protect which columns can be joined on, projected, or activated; however, the template must include the appropriate JinjaSQL policy filter on a column for the policy to be applied.

Syntax einer benutzerdefinierten Vorlage

Snowflake Data Clean Rooms unterstützt V3 JinjaSQL, mit einigen Erweiterungen (wie angegeben).

Regeln für die Benennung von Vorlagen

When creating a template, names must be all lowercase letters, numbers, spaces, or underscores. Activation templates (except for consumer-run provider activation) must have a name beginning with activation_. Template names are assigned when you call provider.add_custom_sql_template or consumer.create_template_request.

Beispiel für gültige Namen:

  • my_template

  • activation_template_1

Beispiel für ungültige Namen:

  • my template - Leerzeichen nicht erlaubt

  • My_Template - Nur Vorlagen mit Kleinschreibung erlaubt

Vorlagenvariablen

Aufrufer von Vorlagen können Werte an Vorlagenvariablen übergeben. Die JinjaSQL-Syntax ermöglicht die Variablenbindung für jeden Variablennamen innerhalb von {{ double_brackets }}, aber Snowflake behält sich einige Variablennamen vor, die Sie nicht überschreiben sollten, wie unten beschrieben.

Vorsicht

Alle Variablen, ob von Snowflake definiert oder benutzerdefiniert, werden vom Benutzer eingegeben und sollten mit entsprechender Vorsicht behandelt werden. Snowflake Data Clean Rooms-Vorlagen müssen eine einzige SELECT-Anweisung ergeben, aber Sie sollten trotzdem daran denken, dass alle Variablen vom Aufrufer übergeben werden.

Snowflake-definierte Variablen

Alle Clean Room-Vorlagen haben Zugriff auf die folgenden globalen Variablen, die von Snowflake definiert, aber vom Aufrufer übergeben werden:

source_table:

Ein nullbasiertes Zeichenfolgen-Array von mit Anbietern verknüpften Tabellen und Ansichten im Clean Room, die von der Vorlage verwendet werden können. Tabellennamen sind voll qualifiziert, zum Beispiel: my_db.my_sch.provider_customers

Beispiel: SELECT col1 FROM IDENTIFIER({{ source_table[0] }}) AS p;

my_table:

Ein nullbasiertes Zeichenfolgen-Array von Verbrauchertabellen und -ansichten im Clean Room, die von der Vorlage verwendet werden können. Tabellennamen sind voll qualifiziert, zum Beispiel: my_db.my_sch.consumer_customers

Beispiel: SELECT col1 FROM IDENTIFIER({{ my_table[0] }}) AS c;

privacy:

A set of privacy-related values associated with users and templates. See the list of available child fields. These values can be set explicitly for the user, but you might want to set default values in the template. Access the child fields directly in your template, such as privacy.threshold.

Beispiel: Hier ist ein Beispiel für eine Vorlage, die threshold_value verwendet, um eine Mindestgruppengröße in einer Aggregationsklausel zu erzwingen.

SELECT
  IFF(a.overlap > ( {{ privacy.threshold_value | default(2)  | sqlsafe }} ),
                    a.overlap,1 ) AS overlap,
  c.total_count AS total_count
  ...
Copy
measure_column:

dimensions:

where_clause:

Legacy clean room global variables. They are no longer recommended for use, but are still defined and appear in some legacy templates and documentation, so you should not alias tables or columns using either of these names to avoid naming collisions.

Wenn Ihre Vorlage measure_column oder dimensions verwendet, wird die Spaltenrichtlinie mit allen Spalten überprüft, die an diese Variablen übergeben werden.

Wenn Ihre Vorlage eine where_clause verwendet, die eine Verknüpfungsbedingung hat (z. B. table1.column1 = table2.column2), wird die Verknüpfungsrichtlinie für alle dort benannten Spalten geprüft. Andernfalls wird die Spaltenrichtlinie für alle dort benannten Spalten geprüft.

Benutzerdefinierte Variablen

Vorlagenersteller können beliebige Variablen in eine Vorlage aufnehmen, die vom Aufrufer befüllt werden können. Diese Variablen, außer die von Snowflake definierten Variablen oder Tabellen-Aliasnamen, können einen beliebigen Jinja-kompatiblen Namen haben. Wenn Sie möchten, dass Ihre Vorlage in der Clean Rooms-UI verwendet werden kann, müssen Sie auch ein UI-Formular für Clean Rooms-UI-Benutzer angeben. Für API-Benutzer sollten Sie eine gute Dokumentation für die erforderlichen und optionalen Variablen bereitstellen.

Auf benutzerdefinierte Variablen kann von Ihrer Vorlage aus zugegriffen werden, wie hier für die benutzerdefinierte Variable max_income gezeigt:

SELECT income FROM my_db.my_sch.customers WHERE income < {{ max_income }};
Copy

Benutzer können Variablen auf zwei verschiedene Arten an eine Vorlage übergeben:

  • In der Clean Rooms-UI durch Auswahl oder Bereitstellung von Werten über einUI-Formular, das vom Entwickler der Vorlage erstellt wurde. Dieses UI-Formular enthält Formularelemente, in denen der Benutzer Werte für Ihre Vorlage bereitstellen kann. Der Name des Formularelements ist der Name der Variablen. Die Vorlage verwendet einfach den Namen des Formularelements, um auf den Wert zuzugreifen. Erstellen Sie das UI-Formular mit provider.add_ui_form_customizations.

  • Im Code ruft ein Verbraucher consumer.run_analysis auf und übergibt Tabellennamen als Argument-Arrays und benutzerdefinierte Variablen als Name-Wert-Paare an das Argument analysis_arguments.

Bemerkung

If you need to access user-provided values in any custom Python code uploaded to the clean room, you must explicitly pass variable values in to the code through Python function arguments; template variables are not directly accessible within the Python code using {{jinja variable binding syntax}}.

Variablen richtig auflösen

In die Vorlage übergebene Zeichenfolgenwerte werden in der endgültigen Vorlage in ein Zeichenfolgenliteral aufgelöst. Dies kann zu SQL-Parsing- oder logischen Fehlern führen, wenn Sie gebundene Variablen nicht angemessen behandeln:

  • SELECT {{ my_col }} FROM P; - This resolves to SELECT 'my_col' from P; which simply returns the string „my_col“ - probably not what you want.

  • SELECT age FROM {{ my_table[0] }} AS P; - This resolves to SELECT age FROM 'somedb.somesch.my_table' AS P;, which causes a parsing error because a table must be an identifier, not a literal string.

  • SELECT age FROM IDENTIFIER({{ my_table[0] }}) AS P {{ where_clause }}; - Passing in „WHERE age < 50“ evaluates to SELECT age FROM mytable AS P 'WHERE age < 50';, which is a parsing error because of the literal string WHERE clause.

Daher müssen Sie, wo es angebracht ist, Variablen auflösen. Hier erfahren Sie, wie Sie Variablen in Ihrer Vorlage richtig auflösen:

Resolving table and column names

Variablen, die Tabellen- oder Spaltennamen enthalten, müssen auf eine der beiden folgenden Arten in Bezeichner in Ihrer Vorlage umgewandelt werden:

  • IDENTIFIER: Zum Beispiel: SELECT IDENTIFIER({{ my_column }}) FROM P;

  • sqlsafe: Dieser JinjaSQL-Filter löst Bezeichnerzeichenfolgen in SQL-Text auf. Eine äquivalente Anweisung zum vorherigen Aufzählungspunkt ist SELECT {{ my_column | sqlsafe }} FROM P;

Ihr spezieller Verwendungszweck bestimmt, wann Sie IDENTIFIER oder sqlsafe verwenden sollten. Zum Beispiel kann c.{{ my_column | sqlsafe }} nicht einfach mit IDENTIFIER umgeschrieben werden.

Resolving dynamic SQL

Wenn Sie eine Zeichenfolgenvariable haben, die als Literal-SQL verwendet werden soll, wie z. B. eine WHERE Klausel, verwenden Sie den sqlsafe-Filter in Ihrer Vorlage. Beispiel:

SELECT age FROM IDENTIFIER({{ my_table[0] }}) AS C WHERE {{ where_clause }};
Copy

Wenn ein Benutzer „age < 50“ in where_clause eingibt, würde die Abfrage SELECT age FROM sometable AS C WHERE 'age < 50'; ergeben, was aufgrund der Bedingung WHERE mit literaler Zeichenfolge ungültiger SQL-Code ist. In diesem Fall sollten Sie den Filter sqlsafe verwenden:

SELECT age FROM IDENTIFIER( {{ my_table[0] }} ) as c {{ where_clause | sqlsafe }};
Copy

Erforderliche Tabellen-Aliasse

At the top level of your query, all tables or subqueries must be aliased as either p (for provider-tables) or c (for consumer tables) in order for Snowflake to validate join and column policies correctly in the query. Any column that must be verified against join or column policies must be qualified with the lowercase p or c table alias. (Specifying p or c tells the back end whether to validate a column against the provider or the consumer policy respectively.)

If you use multiple provider or consumer tables in your query, add a numeric, sequential 1-based suffix to each table alias after the first. So: p, p1, p2, and so on for the first, second, and third provider tables, and c, c1, c2, and so on for the first, second, and third consumer tables. The p or c index should be sequential without gaps (that is, create the aliases p, p1, and p2, not p, p2, and p4).

Beispiel

SELECT p.col1 FROM IDENTIFIER({{ source_table[0] }}) AS P
UNION
SELECT p1.col1 FROM IDENTIFIER({{ source_table[1] }}) AS P1;
Copy

Custom clean room template filters

Snowflake unterstützt alle Standard-Jinja-Filter und die meisten der Standard-JinjaSQL-Filter sowie einige Erweiterungen:

  • join_policy: Succeeds if the column is in the join policy of the data owner; fails otherwise.

  • column_policy: Erfolgreich, wenn die Spalte in der Spaltenrichtlinie des Dateneigentümers enthalten ist; schlägt andernfalls fehl.

  • activation_policy: Erfolgreich, wenn die Spalte in der Aktivierungsrichtlinie des Dateneigentümers enthalten ist; schlägt andernfalls fehl.

  • join_and_column_policy: Erfolgreich, wenn die Spalte in der Verknüpfungs- oder Spaltenrichtlinie des Dateneigentümers enthalten ist; schlägt andernfalls fehl.

  • Der JinjaSQL-Filter identifier wird nicht von Snowflake-Vorlagen unterstützt.

Tipp

JinjaSQL-Anweisungen werden von links nach rechts ausgewertet:

  • {{ my_col | column_policy }} Richtig

  • {{ my_col | sqlsafe | column_policy }} Richtig

  • {{ column_policy | my_col }} Falsch

  • {{ my_col | column_policy | sqlsafe }} Falsch: column_policy wird mit dem my_col-Wert als Zeichenfolge abgeglichen, was ein Fehler ist.

Clean Room-Richtlinien durchsetzen

Clean rooms do not automatically check clean room policies against columns used in a template. If you want to enforce a policy against a column:

  • You must apply the appropriate policy filter to that column in the template. For example:

JOIN IDENTIFIER({{ source_table[0] }}) AS p
  ON IDENTIFIER({{ c_join_col | join_policy }}) = IDENTIFIER({{ p_join_col | join_policy }})
Copy

Richtlinien werden nur für Spalten geprüft, die anderen Teilnehmern gehören. Richtlinien werden nicht auf Ihre eigenen Daten geprüft.

Note that column names cannot be ambiguous when testing policies. So if you have columns with the same name in two tables, you must qualify the column name in order to test the policy against that column.

Benutzerdefinierten Python-Code ausführen

Vorlagen können Python-Code ausführen, der in den Clean Room hochgeladen wurde. Die Vorlage kann eine Python-Funktion aufrufen, die Werte aus einer Datenzeile entgegennimmt und Werte zurückgibt, die in der Abfrage verwendet oder projiziert werden können.

  • Wenn ein Anbieter benutzerdefinierten Python-Code in einen Clean Room hochlädt, ruft die Vorlage Python-Funktionen mit der Syntax cleanroom.function_name auf. Weitere Details dazu finden Sie hier.

  • Wenn ein Verbraucher benutzerdefinierten Python-Code in einen Clean Room hochlädt, ruft die Vorlage die Funktion mit dem leeren function_name-Wert auf, der an consumer.generate_python_request_template übergeben wird (nicht wie der Anbietercode auf Clean Room beschränkt). Weitere Details dazu finden Sie hier.

Beispiel für einen Anbietercode:

-- Provider uploads a Python function that takes two numbers and returns the sum.
CALL samooha_by_snowflake_local_db.provider.load_python_into_cleanroom(
  $cleanroom_name,
  'simple_addition',                        -- Function name to use in the template
  ['someval integer', 'added_val integer'], -- Arguments
  [],                                       -- No packages needed
  'integer',                                -- Return type
  'main',                                   -- Handler for function name
  $$

def main(input, added_val):
  return input + int(added_val)
    $$
);

-- Template passes value from each row to the function, along with a
-- caller-supplied argument named 'increment'
CALL samooha_by_snowflake_local_db.provider.add_custom_sql_template(
    $cleanroom_name,
    'simple_python_example',
$$
    SELECT val, cleanroom.simple_addition(val, {{ increment | sqlsafe }})
    FROM VALUES (5),(8),(12),(39) AS P(val);
$$
);
Copy

Sicherheitshinweise

A clean room template is not executed with the identity of the current user.

Der Benutzer hat keinen direkten Zugriff auf die Daten im Clean Room. Der Zugriff erfolgt ausschließlich über die native Anwendung anhand der Vorlagenergebnisse.

Wenden Sie jedes Mal, wenn eine Spalte in Ihrer Vorlage verwendet wird, einen Richtlinienfilter an, um sicherzustellen, dass Ihre Richtlinien und die Richtlinien aller Teilnehmer beachtet werden.

Schließen Sie vom Benutzer bereitgestellte Variablen wenn möglich mit IDENTIFIER() ein, um Ihre Vorlagen gegen SQL-Einschleusungsangriffe auszurüsten.

Aktivierungsvorlagen

Eine Vorlage kann auch verwendet werden, um Abfrageergebnisse in einer Tabelle außerhalb des Clean Room zu speichern; dies wird Aktivierung genannt. Derzeit werden für benutzerdefinierte Vorlagen nur die Anbieteraktivierung und die Verbraucheraktivierung (Speicherung der Ergebnisse im Snowflake-Konto des Anbieters bzw. Verbrauchers) unterstützt. Erfahren Sie, wie Sie die Aktivierung implementieren.

Eine Aktivierungsvorlage ist eine Analysevorlage mit den folgenden zusätzlichen Anforderungen:

  • Aktivierungsvorlagen sind JinjaSQL-Anweisungen, die einen SQL-Skriptblock ergeben, im Gegensatz zu Analysevorlagen, die einfache SELECT-Anweisungen sein können.

  • Aktivierungsvorlagen erstellen eine Tabelle im Clean Room, in der die Ergebnisse gespeichert werden, und geben den Tabellennamen (oder ein Fragment des Namens) an den Aufrufer der Vorlage zurück.

  • Der Skriptblock sollte mit der Anweisung RETURN enden, die den Namen der generierten Tabelle abzüglich der Präfixe cleanroom. oder cleanroom.activation_data_ zurückgibt.

  • Der Name der Vorlage, der Name der internen Tabelle, die die Vorlage erstellt, und der Tabellenname, den die Vorlage zurückgibt, folgen diesen Mustern:

Activation type

Template name prefix

Namenspräfix für die Tabelle

Returned table name

Vom Verbraucher ausgeführte

activation_

cleanroom.activation_data_*

Tabellenname ohne Präfix

Vom Verbraucher ausgeführter Anbieter

Kein Präfix erforderlich

cleanroom.activation_data_*

Tabellenname ohne Präfix

Vom Anbieter ausgeführte

activation_

cleanroom.temp_result_data ist der vollständige Tabellenname.

temp_result_data

  • Alle Spalten, die aktiviert werden, müssen in der Aktivierungsrichtlinie des Anbieters oder Verbrauchers, der die Daten verknüpft hat, aufgelistet sein. Zudem sollte der activation_policy-Filter darauf angewendet worden sein. Beachten Sie, dass eine Spalte sowohl eine Aktivierungs- als auch eine Verknüpfungsspalte sein kann.

  • Wenn die Vorlage von der Clean Rooms-UI ausgeführt werden soll , sollten Sie ein Webformular bereitstellen, das den activation_template_name und enabled_activations-Felder enthält. Vorlagen zur Verwendung in der UI müssen sowohl eine Analysevorlage als auch eine zugehörige Aktivierungsvorlage haben.

  • Alle berechneten Spalten müssen explizit mit einem Alias versehen werden und dürfen keine abgeleiteten Namen haben, da eine Tabelle erzeugt wird. Das heißt:

    SELECT COUNT(*), p.status from T AS P; FAILS, because the COUNT column name is inferred.

    SELECT COUNT(*) AS COUNT_OF_ITEMS, p.status from T AS P; SUCCEEDS, because it explicitly aliases the COUNT column.

Hier finden Sie zwei Beispiele für grundlegende Aktivierungsvorlagen. Eine ist für die vom Anbieter durchgeführte Serveraktivierung, die andere für andere Aktivierungstypen. Sie unterscheiden sich durch die beiden hervorgehobenen Zeilen, die den Namen der Ergebnistabelle enthalten.

Tabelle muss heißen cleanroom.temp_result_data:

BEGIN
  CREATE OR REPLACE TABLE cleanroom.temp_result_data AS
    SELECT COUNT(c.status) AS ITEM_COUNT, c.status, c.age_band
      FROM IDENTIFIER({{ my_table[0] }}) AS c
    JOIN IDENTIFIER({{ source_table[0] }}) AS p
      ON {{ c_join_col | sqlsafe | activation_policy }} = {{ p_join_col | sqlsafe | activation_policy }}
    GROUP BY c.status, c.age_band
    ORDER BY c.age_band;
  RETURN 'temp_result_data';
END;
Copy

Nächste Schritte

Nachdem Sie das Vorlagensystem gemeistert haben, lesen Sie sich die Einzelheiten zur Implementierung eines Clean Room mit Ihrem Vorlagentyp durch:

  • Anbietervorlagen sind Vorlagen, die vom Anbieter geschrieben wurden. Dies ist der Standardanwendungsfall.

  • Verbrauchervorlagen sind vom Verbraucher geschriebene Vorlagen. In manchen Fällen möchte ein Ersteller von Clean Rooms es dem Verbraucher ermöglichen, seine eigenen Vorlagen im Clean Room zu erstellen, hochzuladen und auszuführen.

  • Aktivierungsvorlagen erstellen nach einer erfolgreichen Ausführung eine Ergebnistabelle. Je nach Aktivierungsvorlage kann die Ergebnistabelle entweder im Konto des Anbieters oder des Verbrauchers außerhalb des Clean Room gespeichert oder an einen Drittanbieter gesendet werden, der im Activation Hub aufgeführt ist.

  • Verkettete Vorlagen ermöglichen es Ihnen, mehrere Vorlagen miteinander zu verketten, wobei die Ausgabe jeder Vorlage von der nächsten Vorlage in der Kette verwendet wird.

Weitere Informationen