<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Takuya Shoji</title>
    <description>The latest articles on DEV Community by Takuya Shoji (@tshoji_data).</description>
    <link>https://dev.to/tshoji_data</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3174969%2Fec986a0e-75ee-42d6-ae09-7734103e96fa.jpg</url>
      <title>DEV Community: Takuya Shoji</title>
      <link>https://dev.to/tshoji_data</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tshoji_data"/>
    <language>en</language>
    <item>
      <title>Near-Zero-Maintenance Open Data Sharing with Snowflake Managed Iceberg Open Data Sharing</title>
      <dc:creator>Takuya Shoji</dc:creator>
      <pubDate>Fri, 21 Aug 2026 01:08:04 +0000</pubDate>
      <link>https://dev.to/tshoji_data/near-zero-maintenance-open-data-sharing-with-snowflake-managed-iceberg-open-data-sharing-3o1j</link>
      <guid>https://dev.to/tshoji_data/near-zero-maintenance-open-data-sharing-with-snowflake-managed-iceberg-open-data-sharing-3o1j</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: This article reflects my personal views and does not represent Snowflake's official position.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; (August 2026) &lt;strong&gt;Open Data Sharing&lt;/strong&gt; is in Public Preview as of this writing. The feature may change before it reaches general availability.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With the release of &lt;a href="https://docs.snowflake.com/en/user-guide/open-data-sharing" rel="noopener noreferrer"&gt;Open Data Sharing&lt;/a&gt;, &lt;a href="https://docs.snowflake.com/en/user-guide/tables-iceberg" rel="noopener noreferrer"&gt;Snowflake's Iceberg Table&lt;/a&gt; offering now covers three dimensions: &lt;strong&gt;catalog&lt;/strong&gt;, &lt;strong&gt;storage&lt;/strong&gt;, and &lt;strong&gt;how you share the data&lt;/strong&gt;. This gives you the flexibility to pick the combination that best fits your use case.&lt;/p&gt;

&lt;p&gt;For a great overview of the catalog and storage options, see this article (Japanese):&lt;br&gt;
&lt;a href="https://zenn.dev/snowflakejp/articles/fdf4ec46570d86" rel="noopener noreferrer"&gt;https://zenn.dev/snowflakejp/articles/fdf4ec46570d86&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this article I focus on the near-zero-maintenance combination: &lt;strong&gt;Snowflake Managed Storage&lt;/strong&gt; + &lt;strong&gt;Open Data Sharing&lt;/strong&gt;, implemented with TPC-H sample data. Here's what we'll cover:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create Snowflake Managed Iceberg Tables&lt;/li&gt;
&lt;li&gt;Load TPC-H sample data&lt;/li&gt;
&lt;li&gt;Publish via Open Data Sharing as an Iceberg REST API (both SQL and Snowsight UI walkthrough)&lt;/li&gt;
&lt;li&gt;Query from an external engine (DuckDB) — no Snowflake account on the consumer side&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Implementation uses an Azure Japan East account.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  tl;dr
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;a href="https://docs.snowflake.com/en/user-guide/tables-iceberg#catalog-options" rel="noopener noreferrer"&gt;Catalog options&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Snowflake as catalog&lt;/strong&gt; — Snowflake manages table metadata (&lt;code&gt;CATALOG = 'SNOWFLAKE'&lt;/code&gt;). Supports full DML, Time Travel, clustering, replication, and most Snowflake features. Best when you want the full Snowflake experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;External catalog&lt;/strong&gt; — Metadata is managed by an external system (AWS Glue, Databricks Unity Catalog, etc.) and accessed through a catalog integration or catalog-linked database. Use this when you need to connect to an existing Iceberg catalog or work with Delta format. Note: cloning, clustering, replication, and standard streams are not available.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;a href="https://docs.snowflake.com/en/user-guide/tables-iceberg-storage" rel="noopener noreferrer"&gt;Storage options&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Snowflake Managed Storage&lt;/strong&gt; — Snowflake stores and manages the table files. No cloud storage setup or IAM configuration needed. Just specify &lt;code&gt;EXTERNAL_VOLUME = SNOWFLAKE_MANAGED&lt;/code&gt; in &lt;code&gt;CREATE ICEBERG TABLE&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;External volume&lt;/strong&gt; — Table files are stored in your own S3, GCS, or Azure Blob. Use when you want to keep data in your existing cloud storage or need to work with an external catalog.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Sharing options
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Secure Data Sharing&lt;/strong&gt; — Snowflake's established data sharing mechanism for sharing tables, views, Semantic Views, AI products (Cortex Search, Cortex Agents), and Native Apps between Snowflake accounts. Best for secure sharing within the Snowflake ecosystem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open Data Sharing&lt;/strong&gt; — Provides read-only access to Iceberg tables via an Iceberg REST API using a PAT (Programmatic Access Token) issued for an External Consumer object. No Snowflake account required on the consumer side. Best for sharing with external partners outside the Snowflake ecosystem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IRC API through Horizon Catalog&lt;/strong&gt; — Provides read/write access from external engines like Spark and Trino through Snowflake's existing auth mechanisms (PAT, key pair, External OAuth, WIF). Supports masking/row-access policies and vended credentials. Best for trusted internal consumers that need write access.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Storage comparison
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Snowflake Managed&lt;/th&gt;
&lt;th&gt;External Volume&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Setup&lt;/td&gt;
&lt;td&gt;Just specify &lt;code&gt;EXTERNAL_VOLUME = SNOWFLAKE_MANAGED&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Requires creating cloud storage, IAM configuration, and an external volume object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Table file location&lt;/td&gt;
&lt;td&gt;Snowflake-provided storage&lt;/td&gt;
&lt;td&gt;Your own cloud storage (S3, GCS, Azure, S3-compatible)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fail-safe&lt;/td&gt;
&lt;td&gt;Available for Permanent tables (7 days)&lt;/td&gt;
&lt;td&gt;None (manage via cloud storage versioning)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time Travel&lt;/td&gt;
&lt;td&gt;Available (up to 90 days)&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bucket &amp;amp; IAM management&lt;/td&gt;
&lt;td&gt;Handled automatically by Snowflake&lt;/td&gt;
&lt;td&gt;You configure buckets and IAM policies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data compaction&lt;/td&gt;
&lt;td&gt;Free and automatic when Snowflake writes&lt;/td&gt;
&lt;td&gt;Charged separately&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supported clouds&lt;/td&gt;
&lt;td&gt;AWS and Azure only&lt;/td&gt;
&lt;td&gt;AWS, Azure, GCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Minimizing operational overhead on new or existing workloads&lt;/td&gt;
&lt;td&gt;Reusing existing cloud storage or working with external Iceberg catalogs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Sharing comparison
&lt;/h3&gt;

&lt;p&gt;Both Open Data Sharing and Horizon Catalog use the Iceberg REST Catalog API. Here's how they compare alongside traditional Secure Data Sharing:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Secure Data Sharing&lt;/th&gt;
&lt;th&gt;Open Data Sharing&lt;/th&gt;
&lt;th&gt;IRC API through Horizon Catalog&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Consumer Snowflake account&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Required&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not required&lt;/td&gt;
&lt;td&gt;Not required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication&lt;/td&gt;
&lt;td&gt;Snowflake credentials (account-to-account)&lt;/td&gt;
&lt;td&gt;External consumer PAT (other methods coming)&lt;/td&gt;
&lt;td&gt;Snowflake user PAT / key pair / External OAuth / WIF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access level&lt;/td&gt;
&lt;td&gt;Read-only&lt;/td&gt;
&lt;td&gt;Read-only&lt;/td&gt;
&lt;td&gt;Read + write&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vended credentials&lt;/td&gt;
&lt;td&gt;Not supported&lt;/td&gt;
&lt;td&gt;Not supported&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data protection policies&lt;/td&gt;
&lt;td&gt;Supported (masking, row access)&lt;/td&gt;
&lt;td&gt;Not supported&lt;/td&gt;
&lt;td&gt;Masking and row access policies supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shareable objects&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Tables, views, Semantic Views, AI products, and more&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Only tables included in the EXTERNAL LISTING&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All Iceberg tables in the account*¹&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;GA&lt;/td&gt;
&lt;td&gt;Public Preview&lt;/td&gt;
&lt;td&gt;GA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Secure sharing within and outside the organization &lt;strong&gt;with&lt;/strong&gt; Snowflake accounts&lt;/td&gt;
&lt;td&gt;Read-only sharing with &lt;strong&gt;external partners who don't have&lt;/strong&gt; a Snowflake account&lt;/td&gt;
&lt;td&gt;Read/write access for &lt;strong&gt;internal external engines&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; *¹ Access to External Iceberg tables via catalog-linked database is in Public Preview as of August 2026. See the &lt;a href="https://docs.snowflake.com/en/user-guide/externally-managed-iceberg-tables-access-horizon-irc" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; for details.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2FZmxvd2NoYXJ0IExSCiAgICBzdWJncmFwaCBTbm93Zmxha2VbIlNub3dmbGFrZSAoQXp1cmUgSmFwYW4gRWFzdCkiXQogICAgICAgIFNhbXBsZVsiU05PV0ZMQUtFX1NBTVBMRV9EQVRBXG5UUEMtSCBTRjEiXQogICAgICAgIEljZWJlcmdbIkljZWJlcmcgVGFibGVcbihTTk9XRkxBS0VfTUFOQUdFRCBTdG9yYWdlKSJdCiAgICAgICAgU2hhcmVbIlNIQVJFXG5pY2ViZXJnX29wZW5fc2hhcmUiXQogICAgICAgIExpc3RpbmdbIkVYVEVSTkFMIExJU1RJTkdcbmljZWJlcmdfb3Blbl9saXN0aW5nIl0KICAgICAgICBDb25zdW1lclsiRVhURVJOQUwgQ09OU1VNRVJcbmljZWJlcmdfY29uc3VtZXIgKyBQQVQiXQogICAgICAgIFNhbXBsZSAtLT58SU5TRVJUIC8gQ1RBU3wgSWNlYmVyZwogICAgICAgIEljZWJlcmcgLS0%2BIFNoYXJlIC0tPiBMaXN0aW5nCiAgICAgICAgQ29uc3VtZXIgLS0%2BIExpc3RpbmcKICAgIGVuZAogICAgQ2xpZW50WyJFeHRlcm5hbCBDbGllbnRcbihEdWNrREIgLyBTcGFyayAvIFB5SWNlYmVyZykiXQogICAgTGlzdGluZyAtLT58SWNlYmVyZyBSRVNUIEFQSSArIFBBVHwgQ2xpZW50" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2FZmxvd2NoYXJ0IExSCiAgICBzdWJncmFwaCBTbm93Zmxha2VbIlNub3dmbGFrZSAoQXp1cmUgSmFwYW4gRWFzdCkiXQogICAgICAgIFNhbXBsZVsiU05PV0ZMQUtFX1NBTVBMRV9EQVRBXG5UUEMtSCBTRjEiXQogICAgICAgIEljZWJlcmdbIkljZWJlcmcgVGFibGVcbihTTk9XRkxBS0VfTUFOQUdFRCBTdG9yYWdlKSJdCiAgICAgICAgU2hhcmVbIlNIQVJFXG5pY2ViZXJnX29wZW5fc2hhcmUiXQogICAgICAgIExpc3RpbmdbIkVYVEVSTkFMIExJU1RJTkdcbmljZWJlcmdfb3Blbl9saXN0aW5nIl0KICAgICAgICBDb25zdW1lclsiRVhURVJOQUwgQ09OU1VNRVJcbmljZWJlcmdfY29uc3VtZXIgKyBQQVQiXQogICAgICAgIFNhbXBsZSAtLT58SU5TRVJUIC8gQ1RBU3wgSWNlYmVyZwogICAgICAgIEljZWJlcmcgLS0%2BIFNoYXJlIC0tPiBMaXN0aW5nCiAgICAgICAgQ29uc3VtZXIgLS0%2BIExpc3RpbmcKICAgIGVuZAogICAgQ2xpZW50WyJFeHRlcm5hbCBDbGllbnRcbihEdWNrREIgLyBTcGFyayAvIFB5SWNlYmVyZykiXQogICAgTGlzdGluZyAtLT58SWNlYmVyZyBSRVNUIEFQSSArIFBBVHwgQ2xpZW50" alt="Overall architecture: SNOWFLAKE_SAMPLE_DATA (TPC-H SF1) is loaded into an Iceberg Table with SNOWFLAKE_MANAGED storage via INSERT/CTAS. The table flows through a SHARE to an EXTERNAL LISTING. An EXTERNAL CONSUMER is linked to the EXTERNAL LISTING, and an external client (DuckDB/Spark/PyIceberg) accesses the data via Iceberg REST API + PAT." width="1811" height="304"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Snowflake account&lt;/td&gt;
&lt;td&gt;AWS or Azure region (&lt;code&gt;SNOWFLAKE_MANAGED&lt;/code&gt; is not available on GCP — see note below)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ACCOUNTADMIN&lt;/code&gt; (or a custom role with the necessary privileges)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Warehouse&lt;/td&gt;
&lt;td&gt;An active warehouse is required when creating Iceberg tables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TPC-H sample data&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;SNOWFLAKE_SAMPLE_DATA&lt;/code&gt; database (available in all accounts)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open Data Sharing&lt;/td&gt;
&lt;td&gt;Public Preview. Data is served from the provider account's region (no cross-region replication)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you're using a &lt;strong&gt;Google Cloud Platform account&lt;/strong&gt;, &lt;code&gt;SNOWFLAKE_MANAGED&lt;/code&gt; is not available. Create an external volume pointing to Google Cloud Storage and specify &lt;code&gt;EXTERNAL_VOLUME = '&amp;lt;your_gcs_volume&amp;gt;'&lt;/code&gt; instead. See the &lt;a href="https://docs.snowflake.com/en/user-guide/tables-iceberg-configure-external-volume-gcs" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Step 1: Set Up the Database, Schema, and Warehouse
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;ACCOUNTADMIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Create warehouse (skip if you already have one)&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;WAREHOUSE&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;iceberg_demo_wh&lt;/span&gt;
  &lt;span class="n"&gt;WAREHOUSE_SIZE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'XSMALL'&lt;/span&gt;
  &lt;span class="n"&gt;AUTO_SUSPEND&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;
  &lt;span class="n"&gt;AUTO_RESUME&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;TRUE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Create database and schema&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;iceberg_demo_db&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;SCHEMA&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;iceberg_demo_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tpch&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;iceberg_demo_db&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="k"&gt;SCHEMA&lt;/span&gt; &lt;span class="n"&gt;tpch&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="n"&gt;WAREHOUSE&lt;/span&gt; &lt;span class="n"&gt;iceberg_demo_wh&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Create Managed Iceberg Tables
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;'SNOWFLAKE_MANAGED'&lt;/code&gt; is a &lt;strong&gt;reserved keyword&lt;/strong&gt;, not the name of an external volume you create. Specifying it means Snowflake manages the underlying storage for you — no S3 bucket, Azure Blob, or IAM setup required.&lt;/p&gt;

&lt;p&gt;We'll demonstrate two creation patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;CUSTOMER&lt;/code&gt;: define columns explicitly, load data in Step 3&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ORDERS&lt;/code&gt;: use CTAS to create and load in one shot&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;First, create the &lt;code&gt;CUSTOMER&lt;/code&gt; table with an explicit column definition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="n"&gt;ICEBERG&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;customer&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;c_custkey&lt;/span&gt;    &lt;span class="nb"&gt;INTEGER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;c_name&lt;/span&gt;       &lt;span class="n"&gt;STRING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;c_address&lt;/span&gt;    &lt;span class="n"&gt;STRING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;c_nationkey&lt;/span&gt;  &lt;span class="nb"&gt;INTEGER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;c_phone&lt;/span&gt;      &lt;span class="n"&gt;STRING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;c_acctbal&lt;/span&gt;    &lt;span class="n"&gt;NUMBER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="n"&gt;c_mktsegment&lt;/span&gt; &lt;span class="n"&gt;STRING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;c_comment&lt;/span&gt;    &lt;span class="n"&gt;STRING&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;EXTERNAL_VOLUME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'SNOWFLAKE_MANAGED'&lt;/span&gt;
&lt;span class="k"&gt;CATALOG&lt;/span&gt;         &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'SNOWFLAKE'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then create &lt;code&gt;ORDERS&lt;/code&gt; using CTAS — this creates and loads the table in one statement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="n"&gt;ICEBERG&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;
  &lt;span class="n"&gt;EXTERNAL_VOLUME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'SNOWFLAKE_MANAGED'&lt;/span&gt;
  &lt;span class="k"&gt;CATALOG&lt;/span&gt;         &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'SNOWFLAKE'&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
  &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;SNOWFLAKE_SAMPLE_DATA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TPCH_SF1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After creation, run &lt;code&gt;SHOW ICEBERG TABLES&lt;/code&gt; to verify the storage type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="n"&gt;ICEBERG&lt;/span&gt; &lt;span class="n"&gt;TABLES&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="k"&gt;SCHEMA&lt;/span&gt; &lt;span class="n"&gt;iceberg_demo_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tpch&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the &lt;code&gt;external_volume_name&lt;/code&gt; column shows &lt;code&gt;SNOWFLAKE_MANAGED&lt;/code&gt; and &lt;code&gt;iceberg_table_type&lt;/code&gt; shows &lt;code&gt;MANAGED&lt;/code&gt;, the tables were created correctly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjbo6pavtrsqjv79knrk3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjbo6pavtrsqjv79knrk3.png" alt="SHOW ICEBERG TABLES result showing CUSTOMER and ORDERS with SNOWFLAKE_MANAGED storage and MANAGED type" width="800" height="72"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Load TPC-H Data
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;SNOWFLAKE_SAMPLE_DATA&lt;/code&gt; is read-only, so we use &lt;code&gt;INSERT INTO ... SELECT&lt;/code&gt; to pull the data into our Iceberg tables.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Load CUSTOMER (TPC-H SF1: ~150,000 rows)&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;iceberg_demo_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tpch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;c_custkey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;c_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;c_address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;c_nationkey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;c_phone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;c_acctbal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;c_mktsegment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;c_comment&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;SNOWFLAKE_SAMPLE_DATA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TPCH_SF1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CUSTOMER&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Verify row count&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;iceberg_demo_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tpch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;-- → 150,000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Iceberg tables support full DML just like regular Snowflake tables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Check customer distribution by market segment&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;c_mktsegment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;cnt&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;iceberg_demo_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tpch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;c_mktsegment&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;cnt&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 4: Set Up Open Data Sharing
&lt;/h2&gt;

&lt;p&gt;With the data loaded, we can now set up external sharing. Open Data Sharing can be configured via &lt;strong&gt;SQL&lt;/strong&gt; or the &lt;strong&gt;Snowsight UI&lt;/strong&gt; — the underlying operations are identical.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fc2VxdWVuY2VEaWFncmFtCiAgICBwYXJ0aWNpcGFudCBBZG1pbiBhcyBTbm93Zmxha2UgQWRtaW4KICAgIHBhcnRpY2lwYW50IFNGIGFzIFNub3dmbGFrZQogICAgcGFydGljaXBhbnQgQ2xpZW50IGFzIEV4dGVybmFsIENsaWVudAoKICAgIEFkbWluLT4%2BU0Y6IENyZWF0ZSBFeHRlcm5hbCBMaXN0aW5nIHdpdGggc2hhcmVkIHRhYmxlcwogICAgQWRtaW4tPj5TRjogR2V0IGNhdGFsb2dfdXJpCiAgICBBZG1pbi0%2BPlNGOiBDcmVhdGUgRXh0ZXJuYWwgQ29uc3VtZXIKICAgIFNGLS0%2BPkFkbWluOiBQQVQgU2VjcmV0IChzYXZlIGltbWVkaWF0ZWx5KQogICAgQWRtaW4tPj5DbGllbnQ6IFByb3ZpZGUgY2F0YWxvZ191cmkgKyBQQVQKICAgIENsaWVudC0%2BPlNGOiBBY2Nlc3MgdmlhIEljZWJlcmcgUkVTVCBBUEk%3D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fc2VxdWVuY2VEaWFncmFtCiAgICBwYXJ0aWNpcGFudCBBZG1pbiBhcyBTbm93Zmxha2UgQWRtaW4KICAgIHBhcnRpY2lwYW50IFNGIGFzIFNub3dmbGFrZQogICAgcGFydGljaXBhbnQgQ2xpZW50IGFzIEV4dGVybmFsIENsaWVudAoKICAgIEFkbWluLT4%2BU0Y6IENyZWF0ZSBFeHRlcm5hbCBMaXN0aW5nIHdpdGggc2hhcmVkIHRhYmxlcwogICAgQWRtaW4tPj5TRjogR2V0IGNhdGFsb2dfdXJpCiAgICBBZG1pbi0%2BPlNGOiBDcmVhdGUgRXh0ZXJuYWwgQ29uc3VtZXIKICAgIFNGLS0%2BPkFkbWluOiBQQVQgU2VjcmV0IChzYXZlIGltbWVkaWF0ZWx5KQogICAgQWRtaW4tPj5DbGllbnQ6IFByb3ZpZGUgY2F0YWxvZ191cmkgKyBQQVQKICAgIENsaWVudC0%2BPlNGOiBBY2Nlc3MgdmlhIEljZWJlcmcgUkVTVCBBUEk%3D" alt="Open Data Sharing setup flow: Snowflake Admin creates an External Listing with shared tables, gets catalog_uri, creates an External Consumer, receives PAT Secret, then provides catalog_uri + PAT to the external client who accesses via Iceberg REST API" width="851" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Warning:&lt;/strong&gt; The PAT secret is shown only once at creation time. Copy it immediately — there's no way to retrieve it later. If you lose it, drop the PAT and create a new one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If your account has a network policy, you need to add an entry for each external consumer. See the &lt;a href="https://docs.snowflake.com/en/user-guide/open-data-sharing" rel="noopener noreferrer"&gt;Open Data Sharing documentation&lt;/a&gt; for details.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Option A: SQL Setup
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Step 4-SQL-1: Create a Share and Grant Privileges
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Create the share&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="k"&gt;SHARE&lt;/span&gt; &lt;span class="n"&gt;iceberg_open_share&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Grant access to the database, schema, and tables&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;USAGE&lt;/span&gt;  &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;iceberg_demo_db&lt;/span&gt;                 &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="k"&gt;SHARE&lt;/span&gt; &lt;span class="n"&gt;iceberg_open_share&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;USAGE&lt;/span&gt;  &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;SCHEMA&lt;/span&gt;   &lt;span class="n"&gt;iceberg_demo_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tpch&lt;/span&gt;            &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="k"&gt;SHARE&lt;/span&gt; &lt;span class="n"&gt;iceberg_open_share&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt;    &lt;span class="n"&gt;iceberg_demo_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tpch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer&lt;/span&gt;   &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="k"&gt;SHARE&lt;/span&gt; &lt;span class="n"&gt;iceberg_open_share&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt;    &lt;span class="n"&gt;iceberg_demo_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tpch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;     &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="k"&gt;SHARE&lt;/span&gt; &lt;span class="n"&gt;iceberg_open_share&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 4-SQL-2: Create the External Listing
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;EXTERNAL&lt;/span&gt; &lt;span class="n"&gt;LISTING&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;iceberg_open_listing&lt;/span&gt;
  &lt;span class="k"&gt;SHARE&lt;/span&gt; &lt;span class="n"&gt;iceberg_open_share&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt;
&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;"TPC-H Iceberg Demo"&lt;/span&gt;
&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;"Snowflake Managed Iceberg Table demo using TPC-H SF1 dataset"&lt;/span&gt;
&lt;span class="n"&gt;open_sharing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;catalog_identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;"iceberg-demo-db"&lt;/span&gt;
&lt;span class="n"&gt;listing_terms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;"OFFLINE"&lt;/span&gt;  &lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="n"&gt;Term&lt;/span&gt; &lt;span class="n"&gt;acceptance&lt;/span&gt; &lt;span class="n"&gt;happens&lt;/span&gt; &lt;span class="n"&gt;outside&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;Snowflake&lt;/span&gt; &lt;span class="n"&gt;platform&lt;/span&gt;
&lt;span class="n"&gt;external_targets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="k"&gt;access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;external_consumers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ICEBERG_CONSUMER&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;catalog_identifier&lt;/code&gt; is the catalog name that consumers will use to reference the data (corresponds to the "Catalog Identifier" field in the Snowsight UI).&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 4-SQL-3: Verify the Listing and Get the Connection Info
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Check listing status&lt;/span&gt;
&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="n"&gt;LISTINGS&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'ICEBERG_OPEN_LISTING'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;DESC&lt;/span&gt; &lt;span class="n"&gt;LISTING&lt;/span&gt; &lt;span class="n"&gt;iceberg_open_listing&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Get the catalog_uri to give to consumers&lt;/span&gt;
&lt;span class="k"&gt;CALL&lt;/span&gt; &lt;span class="k"&gt;SYSTEM&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;GET_LISTING_URL_FOR_EXTERNAL_CONSUMER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ICEBERG_OPEN_LISTING'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sample result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"catalog"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"iceberg-demo-db"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"catalog_uri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://&amp;lt;account-identifier&amp;gt;.snowflakecomputing.com/polaris/open-sharing/api/catalog"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"session:role:external"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The URL contains &lt;code&gt;/polaris/open-sharing/api/catalog&lt;/code&gt; — this is Open Data Sharing's dedicated endpoint, distinct from the Horizon Catalog endpoint (&lt;code&gt;/polaris/api/catalog&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Give consumers four pieces of information: &lt;code&gt;catalog_uri&lt;/code&gt;, &lt;code&gt;catalog&lt;/code&gt; (catalog name), &lt;code&gt;scope&lt;/code&gt;, and the PAT secret.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 4-SQL-4: Create the External Consumer and Issue a PAT
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;ACCOUNTADMIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Create the External Consumer object&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="k"&gt;EXTERNAL&lt;/span&gt; &lt;span class="n"&gt;CONSUMER&lt;/span&gt; &lt;span class="n"&gt;iceberg_consumer&lt;/span&gt;
  &lt;span class="k"&gt;COMMENT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Test consumer'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Issue a PAT (copy the secret from the result and save it securely)&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;EXTERNAL&lt;/span&gt; &lt;span class="n"&gt;CONSUMER&lt;/span&gt; &lt;span class="n"&gt;iceberg_consumer&lt;/span&gt; &lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="n"&gt;PAT&lt;/span&gt; &lt;span class="n"&gt;demo_pat&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sample result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+----------+-------------------------------------------------+
| pat_name | secret                                          |
+----------+-------------------------------------------------+
| DEMO_PAT | &amp;lt;copy this secret and store it safely&amp;gt;          |
+----------+-------------------------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Option B: Snowsight UI Setup
&lt;/h3&gt;

&lt;p&gt;The UI walkthrough covers the same operations as the SQL approach. Follow along with the screenshots.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 4-UI-1: Open the "Open Sharing" wizard
&lt;/h4&gt;

&lt;p&gt;In Snowsight, go to &lt;strong&gt;Data sharing → External sharing&lt;/strong&gt;. Click the &lt;strong&gt;Share&lt;/strong&gt; dropdown in the top right and select &lt;strong&gt;Open share&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4rtm3l2e4wfd1j7100x9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4rtm3l2e4wfd1j7100x9.png" alt="External Sharing page — " width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 4-UI-2: Select the tables to share
&lt;/h4&gt;

&lt;p&gt;From the &lt;strong&gt;Select Data&lt;/strong&gt; dropdown, expand &lt;code&gt;ICEBERG_DEMO_DB &amp;gt; TPCH&lt;/code&gt; and check both &lt;code&gt;CUSTOMER&lt;/code&gt; and &lt;code&gt;ORDERS&lt;/code&gt;. Click &lt;strong&gt;Done&lt;/strong&gt;. Only Iceberg tables appear as selectable in the UI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4e4r7upczb5h5dxt65j5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4e4r7upczb5h5dxt65j5.png" alt="Table selection: CUSTOMER and ORDERS checked under ICEBERG_DEMO_DB.TPCH" width="800" height="650"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 4-UI-3: Configure the listing and add an External Consumer
&lt;/h4&gt;

&lt;p&gt;On the next screen, configure the listing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Catalog Identifier&lt;/strong&gt;: the name consumers use to reference the catalog (set to &lt;code&gt;iceberg-open-listing&lt;/code&gt; here)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open Sharing Identifier&lt;/strong&gt; / &lt;strong&gt;SQL Listing Name&lt;/strong&gt;: auto-generated, but editable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flcvqgtzwkrolhxbf3vkv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flcvqgtzwkrolhxbf3vkv.png" alt="Listing configuration: catalog identifier set to iceberg-open-listing with auto-generated identifiers" width="800" height="915"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;+ Add&lt;/strong&gt; under "Add external consumers".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fngflz4777zkdor70w1r5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fngflz4777zkdor70w1r5.png" alt="Clicking " width="800" height="906"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 4-UI-4: Create a new External Consumer
&lt;/h4&gt;

&lt;p&gt;In the consumer search dropdown, select &lt;strong&gt;+ New external consumer&lt;/strong&gt;. Fill in the name and comment in the dialog. The region (Azure - Japan East) and authentication method (PAT Token) are set automatically. Click &lt;strong&gt;Create external consumer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxgte6zanhysrcbvwpira.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxgte6zanhysrcbvwpira.png" alt="Create External Consumer dialog: name ICEBERG_CONSUMER, region Azure - Japan East (Tokyo), auth method PAT Token" width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 4-UI-5: Confirm and create the open sharing
&lt;/h4&gt;

&lt;p&gt;Verify that the new consumer appears in the "Add External Consumer" field, then click &lt;strong&gt;Create open share&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F35ilp6k22jj4s08rnoy7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F35ilp6k22jj4s08rnoy7.png" alt="Final confirmation: ICEBERG_CONSUMER added, catalog identifier iceberg-open-listing, listing name ICEBERG_OPEN_LISTING" width="590" height="738"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 4-UI-6: Check the endpoint on the detail page
&lt;/h4&gt;

&lt;p&gt;After creation, you land on the listing detail page. The &lt;strong&gt;Share Endpoint&lt;/strong&gt; section shows the &lt;strong&gt;catalog name&lt;/strong&gt;, &lt;strong&gt;catalog URI&lt;/strong&gt;, and &lt;strong&gt;OAuth URI&lt;/strong&gt;. You can also download all connection details as a &lt;code&gt;.txt&lt;/code&gt; file using &lt;strong&gt;Download config (.txt)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8l5tv49kwhw8viowg1ma.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8l5tv49kwhw8viowg1ma.png" alt="ICEBERG_OPEN_SHARE detail page: sharing endpoints (catalog URI, OAuth URI), external consumer ICEBERG_CONSUMER, and data tables CUSTOMER/ORDERS" width="800" height="829"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This information corresponds to the JSON returned by &lt;code&gt;CALL SYSTEM$GET_LISTING_URL_FOR_EXTERNAL_CONSUMER&lt;/code&gt; in the SQL path.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 4-UI-7: Issue the PAT from the External Consumer detail page
&lt;/h4&gt;

&lt;p&gt;Click &lt;strong&gt;ICEBERG_CONSUMER&lt;/strong&gt; in the "External consumers" section, then click &lt;strong&gt;Generate token&lt;/strong&gt; in the "Programmatic access tokens" section.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbtkpiucx3cnxlm91dpfx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbtkpiucx3cnxlm91dpfx.png" alt="ICEBERG_CONSUMER detail page: Azure - Japan East (Tokyo) region, PAT Token auth method, and " width="800" height="683"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Set a name and expiry in the dialog, then click &lt;strong&gt;Create PAT&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxz6pb41k9w4uv4kicpq2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxz6pb41k9w4uv4kicpq2.png" alt="New programmatic access token dialog: name DEMO_PAT, expires in 3 months" width="800" height="664"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F61w1z61zg3pntklt66y5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F61w1z61zg3pntklt66y5.png" alt="PAT successfully generated for ICEBERG_CONSUMER — copy or download the token immediately" width="800" height="664"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Copy to clipboard and close&lt;/strong&gt;. Give consumers the catalog URI from Step 4-UI-6 and this PAT secret.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Warning:&lt;/strong&gt; Once the PAT is generated, copy or download the secret &lt;strong&gt;immediately&lt;/strong&gt;. Closing this screen makes it permanently inaccessible.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After setup, your open sharing listing appears under &lt;strong&gt;Data Sharing → Share with your account&lt;/strong&gt; as type "Open Sharing".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcpxqpgc0fsz2gqplqlp5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcpxqpgc0fsz2gqplqlp5.png" alt="External sharing list: ICEBERG_OPEN_SHARE with type " width="800" height="315"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Query from DuckDB
&lt;/h2&gt;

&lt;p&gt;We'll use &lt;strong&gt;DuckDB 1.2+&lt;/strong&gt; with &lt;a href="https://duckdb.org/docs/current/core_extensions/iceberg/catalogs" rel="noopener noreferrer"&gt;the &lt;code&gt;iceberg&lt;/code&gt; extension&lt;/a&gt; as our external client.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;duckdb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;duckdb&lt;/span&gt;

&lt;span class="c1"&gt;# Connection info from Step 4-UI-6 or Step 4-SQL-3
# (result of CALL SYSTEM$GET_LISTING_URL_FOR_EXTERNAL_CONSUMER('ICEBERG_OPEN_LISTING'))
&lt;/span&gt;&lt;span class="n"&gt;OPEN_SHARING_JSON&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;catalog_uri&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://&amp;lt;account-identifier&amp;gt;.snowflakecomputing.com/polaris/open-sharing/api/catalog&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;catalog&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;catalog_name&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scope&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;session:role:external&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;open_sharing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OPEN_SHARING_JSON&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;CATALOG_URI&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;open_sharing&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;catalog_uri&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# /polaris/open-sharing/api/catalog
&lt;/span&gt;&lt;span class="n"&gt;CATALOG_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;open_sharing&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;catalog&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;       &lt;span class="c1"&gt;# value of the catalog field
&lt;/span&gt;&lt;span class="n"&gt;SCOPE&lt;/span&gt;        &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;open_sharing&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scope&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;         &lt;span class="c1"&gt;# session:role:external (fixed for Open Sharing)
&lt;/span&gt;&lt;span class="n"&gt;TOKEN_URI&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;CATALOG_URI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rstrip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/v1/oauth/tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;PAT_SECRET&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;PAT secret saved at issuance time&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;con&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;duckdb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;con&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;INSTALL iceberg; LOAD iceberg;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;con&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;INSTALL httpfs;  LOAD httpfs;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Register the PAT as an OAuth2 credential
# DuckDB automatically runs the client_credentials flow against TOKEN_URI
&lt;/span&gt;&lt;span class="n"&gt;con&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    CREATE OR REPLACE SECRET open_sharing_secret (
        TYPE              ICEBERG,
        CLIENT_ID         &lt;/span&gt;&lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="s"&gt;,
        CLIENT_SECRET     &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;PAT_SECRET&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;,
        OAUTH2_SERVER_URI &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;TOKEN_URI&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;,
        OAUTH2_GRANT_TYPE &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;client_credentials&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;,
        OAUTH2_SCOPE      &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;SCOPE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;
    )
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Attach the Iceberg REST Catalog
&lt;/span&gt;&lt;span class="n"&gt;con&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    ATTACH &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;CATALOG_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; AS open_catalog (
        TYPE                   ICEBERG,
        ENDPOINT               &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;CATALOG_URI&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;,
        SECRET                 open_sharing_secret,
        ACCESS_DELEGATION_MODE &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;vended_credentials&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;
    )
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# List all tables (schema column gives the query path)
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;con&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SHOW ALL TABLES&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;fetchdf&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sample &lt;code&gt;SHOW ALL TABLES&lt;/code&gt; output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       database schema      name
0  open_catalog   TPCH  CUSTOMER
1  open_catalog   TPCH    ORDERS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tables are referenced as &lt;code&gt;open_catalog."&amp;lt;schema&amp;gt;"."&amp;lt;table&amp;gt;"&lt;/code&gt;. Always check &lt;code&gt;SHOW ALL TABLES&lt;/code&gt; to get the exact schema name before querying.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check the CUSTOMER table schema and fetch the first rows:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Describe schema
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;con&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;DESCRIBE open_catalog.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TPCH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CUSTOMER&lt;/span&gt;&lt;span class="sh"&gt;"'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;fetchdf&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="c1"&gt;# Fetch first 10 rows
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;con&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'''&lt;/span&gt;&lt;span class="s"&gt;
    SELECT c_custkey, c_name, c_mktsegment, c_acctbal
    FROM open_catalog.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TPCH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CUSTOMER&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;
    LIMIT 10
&lt;/span&gt;&lt;span class="sh"&gt;'''&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;fetchdf&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   C_CUSTKEY              C_NAME C_MKTSEGMENT  C_ACCTBAL
0          1  Customer#000000001     BUILDING     711.56
1          2  Customer#000000002   AUTOMOBILE     121.65
2          3  Customer#000000003   AUTOMOBILE    7498.12
3          4  Customer#000000004    MACHINERY    2866.83
4          5  Customer#000000005    HOUSEHOLD     794.47
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Row count and market segment breakdown (TPC-H SF1: 150,000 total):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;con&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'''&lt;/span&gt;&lt;span class="s"&gt;
    SELECT c_mktsegment, COUNT(*) AS cnt
    FROM open_catalog.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TPCH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CUSTOMER&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;
    GROUP BY c_mktsegment ORDER BY cnt DESC
&lt;/span&gt;&lt;span class="sh"&gt;'''&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;fetchdf&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  C_MKTSEGMENT    cnt
0    HOUSEHOLD  30189
1     BUILDING  30142
2    FURNITURE  29968
3    MACHINERY  29949
4   AUTOMOBILE  29752
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Join CUSTOMER and ORDERS for a revenue summary by segment:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;con&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'''&lt;/span&gt;&lt;span class="s"&gt;
    SELECT
        c.c_mktsegment,
        COUNT(o.o_orderkey)             AS order_count,
        ROUND(SUM(o.o_totalprice), 2)   AS total_revenue,
        ROUND(AVG(o.o_totalprice), 2)   AS avg_order_price
    FROM open_catalog.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TPCH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ORDERS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   o
    JOIN open_catalog.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TPCH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CUSTOMER&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; c ON o.o_custkey = c.c_custkey
    GROUP BY c.c_mktsegment
    ORDER BY total_revenue DESC
&lt;/span&gt;&lt;span class="sh"&gt;'''&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;fetchdf&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  C_MKTSEGMENT  order_count   total_revenue  avg_order_price
0     BUILDING       303959  45906759082.38        151029.44
1    HOUSEHOLD       300147  45393200282.40        151236.57
2    FURNITURE       299461  45312940516.95        151314.99
3    MACHINERY       298980  45201073855.83        151184.26
4   AUTOMOBILE       297453  45015339723.27        151335.97
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Registering the PAT as an OAuth2 credential via &lt;code&gt;CREATE SECRET&lt;/code&gt; is all it takes — DuckDB handles the token exchange automatically. From a machine with no Snowflake account at all, you can query TPC-H data with plain SQL.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What we did&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Create Iceberg tables&lt;/td&gt;
&lt;td&gt;Delegated storage management to Snowflake with &lt;code&gt;EXTERNAL_VOLUME = 'SNOWFLAKE_MANAGED'&lt;/code&gt; — no external storage or IAM setup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Load data&lt;/td&gt;
&lt;td&gt;Loaded TPC-H sample data with &lt;code&gt;INSERT INTO ... SELECT&lt;/code&gt; (CUSTOMER) and CTAS (ORDERS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Set up Open Data Sharing (SQL)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;EXTERNAL CONSUMER&lt;/code&gt; → PAT → &lt;code&gt;SHARE&lt;/code&gt; → &lt;code&gt;EXTERNAL LISTING&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Set up Open Data Sharing (UI)&lt;/td&gt;
&lt;td&gt;External Sharing → Open Sharing wizard — table selection and consumer creation in a few clicks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;External access&lt;/td&gt;
&lt;td&gt;Iceberg REST API + PAT enables data access with no Snowflake account on the consumer side&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Snowflake Managed Storage&lt;/strong&gt; dramatically simplifies setup compared to a custom external volume. No external storage, no IAM to configure. You still get Time Travel, Fail-safe, clustering, and other Snowflake operational capabilities — and because data is stored in Iceberg format, you don't lose interoperability with external engines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open Data Sharing&lt;/strong&gt; differs from Horizon Catalog IRC access in one key way: it doesn't require consumers to have a Snowflake account, and read access is strictly enforced. A single PAT hands off Iceberg REST API access, making it well-suited for sharing data with external partners or systems outside the Snowflake ecosystem. Use the UI for a quick setup; use SQL when you need IaC or automation.&lt;/p&gt;

&lt;p&gt;One current limitation: per-table data protection policies (masking, row access) are not yet supported in Open Data Sharing, so you may need to prepare consumer-specific views or tables per share. More capabilities are coming.&lt;/p&gt;




&lt;h2&gt;
  
  
  Change Log
&lt;/h2&gt;

&lt;p&gt;(20260820) Initial post&lt;/p&gt;

&lt;h2&gt;
  
  
  Original Japanese Article
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://zenn.dev/tsubasa_tech/articles/snowflake_iceberg_open_sharing" rel="noopener noreferrer"&gt;Snowflake Managed Iceberg × Open Data Sharing によるニアゼロメンテナンスなオープン共有&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Snowflake CoCo Skills, Plugins, and Profiles: When to Use Each and How to Share Them</title>
      <dc:creator>Takuya Shoji</dc:creator>
      <pubDate>Tue, 04 Aug 2026 05:34:29 +0000</pubDate>
      <link>https://dev.to/tshoji_data/snowflake-coco-skills-plugins-and-profiles-when-to-use-each-and-how-to-share-them-1nhp</link>
      <guid>https://dev.to/tshoji_data/snowflake-coco-skills-plugins-and-profiles-when-to-use-each-and-how-to-share-them-1nhp</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Snowflake CoCo (Cortex Code was renamed CoCo at Snowflake Summit 2026) is Snowflake's AI coding agent for SQL authoring, data analysis, and app development and more. It's available in several interfaces: CoCo in Snowsight, CoCo CLI, CoCo Desktop, &lt;a href="https://docs.snowflake.com/en/user-guide/vscode-ext" rel="noopener noreferrer"&gt;VS Code Extension&lt;/a&gt;, and &lt;a href="https://claude.com/plugins/snowflake-cortex-code" rel="noopener noreferrer"&gt;Claude Code Plugin&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Across all of these, you can extend agent behavior using &lt;strong&gt;Skills&lt;/strong&gt; and &lt;strong&gt;Plugins&lt;/strong&gt;. The names are similar enough to cause confusion, but each plays a distinct role. Additionally, &lt;strong&gt;Profile&lt;/strong&gt; is the highest-level extension package — its spec may change before GA.&lt;/p&gt;

&lt;p&gt;This article explains what each one is, when to use it, and how to share Skills and Plugins with your team using the recently added &lt;strong&gt;Skills and Plugins Sharing&lt;/strong&gt; feature.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: This article reflects my personal views and does not represent Snowflake's official position.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; (July 2026) Skills and Plugins Sharing is in Public Preview (available in all accounts). Profile behavior may change in future updates.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  tl;dr
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;Plugin&lt;/th&gt;
&lt;th&gt;Profile&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Main purpose&lt;/td&gt;
&lt;td&gt;Inject domain knowledge and procedures&lt;/td&gt;
&lt;td&gt;Package extensions&lt;/td&gt;
&lt;td&gt;Switch configuration sets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What it is&lt;/td&gt;
&lt;td&gt;Single &lt;code&gt;.md&lt;/code&gt; file&lt;/td&gt;
&lt;td&gt;Directory (multiple components)&lt;/td&gt;
&lt;td&gt;JSON config object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contains&lt;/td&gt;
&lt;td&gt;Instructions and workflows&lt;/td&gt;
&lt;td&gt;Skills + Hooks + MCP servers + Agents&lt;/td&gt;
&lt;td&gt;Skills + MCP + Hooks + Plugins + System Prompt + settings + permissions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Management commands&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/skill&lt;/code&gt; / &lt;code&gt;$&amp;lt;skill-name&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/plugin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/profile&lt;/code&gt; / &lt;code&gt;cortex profile&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How to share&lt;/td&gt;
&lt;td&gt;Catalog / Stage / Git&lt;/td&gt;
&lt;td&gt;GitHub / local / catalog&lt;/td&gt;
&lt;td&gt;Stage / GitHub&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The containment hierarchy looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2FZmxvd2NoYXJ0IFRCCiAgICBzdWJncmFwaCBQcm9maWxlWyJQcm9maWxlIChUb3AtTGV2ZWwgUGFja2FnZSkiXQogICAgICAgIGRpcmVjdGlvbiBUQgogICAgICAgIHN1YmdyYXBoIFBsdWdpblsiUGx1Z2luIChFeHRlbnNpb24gVW5pdCkiXQogICAgICAgICAgICBkaXJlY3Rpb24gTFIKICAgICAgICAgICAgUFNbIlNraWxsIl0KICAgICAgICAgICAgUEhbIkhvb2siXQogICAgICAgICAgICBQTVsiTUNQIFNlcnZlciJdCiAgICAgICAgICAgIFBBWyJTdWJhZ2VudCJdCiAgICAgICAgZW5kCiAgICAgICAgc3ViZ3JhcGggRGlyZWN0WyJFbGVtZW50cyBQcm9maWxlIENhbiBJbmNsdWRlIERpcmVjdGx5Il0KICAgICAgICAgICAgZGlyZWN0aW9uIExSCiAgICAgICAgICAgIERTWyJTa2lsbCJdCiAgICAgICAgICAgIERIWyJIb29rIl0KICAgICAgICAgICAgRE1bIk1DUCBTZXJ2ZXIiXQogICAgICAgICAgICBEUFsiU3lzdGVtIFByb21wdCJdCiAgICAgICAgICAgIERFWyJlbnZWYXJzIC8gU2V0dGluZ3MiXQogICAgICAgIGVuZAogICAgZW5kCgogICAgc3R5bGUgUHJvZmlsZSBmaWxsOiMxMTU2N0Ysc3Ryb2tlOiMxMTU2N0YsY29sb3I6I0ZGRkZGRgogICAgc3R5bGUgUGx1Z2luIGZpbGw6IzI5QjVFOCxzdHJva2U6IzExNTY3Rixjb2xvcjojRkZGRkZGCiAgICBzdHlsZSBEaXJlY3QgZmlsbDojMTE1NjdGLHN0cm9rZTojRTY1MTAwLHN0cm9rZS1kYXNoYXJyYXk6NSAzLGNvbG9yOiNGRkZGRkYKICAgIHN0eWxlIFBTIGZpbGw6I0U4RjRGRCxzdHJva2U6IzExNTY3Rixjb2xvcjojMTE1NjdGCiAgICBzdHlsZSBQSCBmaWxsOiNFOEY0RkQsc3Ryb2tlOiMxMTU2N0YsY29sb3I6IzExNTY3RgogICAgc3R5bGUgUE0gZmlsbDojRThGNEZELHN0cm9rZTojMTE1NjdGLGNvbG9yOiMxMTU2N0YKICAgIHN0eWxlIFBBIGZpbGw6I0U4RjRGRCxzdHJva2U6IzExNTY3Rixjb2xvcjojMTE1NjdGCiAgICBzdHlsZSBEUyBmaWxsOiNFOEY0RkQsc3Ryb2tlOiMxMTU2N0YsY29sb3I6IzExNTY3RgogICAgc3R5bGUgREggZmlsbDojRThGNEZELHN0cm9rZTojMTE1NjdGLGNvbG9yOiMxMTU2N0YKICAgIHN0eWxlIERNIGZpbGw6I0U4RjRGRCxzdHJva2U6IzExNTY3Rixjb2xvcjojMTE1NjdGCiAgICBzdHlsZSBEUCBmaWxsOiNFOEY0RkQsc3Ryb2tlOiMxMTU2N0YsY29sb3I6IzExNTY3RgogICAgc3R5bGUgREUgZmlsbDojRThGNEZELHN0cm9rZTojMTE1NjdGLGNvbG9yOiMxMTU2N0Y%3D" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2FZmxvd2NoYXJ0IFRCCiAgICBzdWJncmFwaCBQcm9maWxlWyJQcm9maWxlIChUb3AtTGV2ZWwgUGFja2FnZSkiXQogICAgICAgIGRpcmVjdGlvbiBUQgogICAgICAgIHN1YmdyYXBoIFBsdWdpblsiUGx1Z2luIChFeHRlbnNpb24gVW5pdCkiXQogICAgICAgICAgICBkaXJlY3Rpb24gTFIKICAgICAgICAgICAgUFNbIlNraWxsIl0KICAgICAgICAgICAgUEhbIkhvb2siXQogICAgICAgICAgICBQTVsiTUNQIFNlcnZlciJdCiAgICAgICAgICAgIFBBWyJTdWJhZ2VudCJdCiAgICAgICAgZW5kCiAgICAgICAgc3ViZ3JhcGggRGlyZWN0WyJFbGVtZW50cyBQcm9maWxlIENhbiBJbmNsdWRlIERpcmVjdGx5Il0KICAgICAgICAgICAgZGlyZWN0aW9uIExSCiAgICAgICAgICAgIERTWyJTa2lsbCJdCiAgICAgICAgICAgIERIWyJIb29rIl0KICAgICAgICAgICAgRE1bIk1DUCBTZXJ2ZXIiXQogICAgICAgICAgICBEUFsiU3lzdGVtIFByb21wdCJdCiAgICAgICAgICAgIERFWyJlbnZWYXJzIC8gU2V0dGluZ3MiXQogICAgICAgIGVuZAogICAgZW5kCgogICAgc3R5bGUgUHJvZmlsZSBmaWxsOiMxMTU2N0Ysc3Ryb2tlOiMxMTU2N0YsY29sb3I6I0ZGRkZGRgogICAgc3R5bGUgUGx1Z2luIGZpbGw6IzI5QjVFOCxzdHJva2U6IzExNTY3Rixjb2xvcjojRkZGRkZGCiAgICBzdHlsZSBEaXJlY3QgZmlsbDojMTE1NjdGLHN0cm9rZTojRTY1MTAwLHN0cm9rZS1kYXNoYXJyYXk6NSAzLGNvbG9yOiNGRkZGRkYKICAgIHN0eWxlIFBTIGZpbGw6I0U4RjRGRCxzdHJva2U6IzExNTY3Rixjb2xvcjojMTE1NjdGCiAgICBzdHlsZSBQSCBmaWxsOiNFOEY0RkQsc3Ryb2tlOiMxMTU2N0YsY29sb3I6IzExNTY3RgogICAgc3R5bGUgUE0gZmlsbDojRThGNEZELHN0cm9rZTojMTE1NjdGLGNvbG9yOiMxMTU2N0YKICAgIHN0eWxlIFBBIGZpbGw6I0U4RjRGRCxzdHJva2U6IzExNTY3Rixjb2xvcjojMTE1NjdGCiAgICBzdHlsZSBEUyBmaWxsOiNFOEY0RkQsc3Ryb2tlOiMxMTU2N0YsY29sb3I6IzExNTY3RgogICAgc3R5bGUgREggZmlsbDojRThGNEZELHN0cm9rZTojMTE1NjdGLGNvbG9yOiMxMTU2N0YKICAgIHN0eWxlIERNIGZpbGw6I0U4RjRGRCxzdHJva2U6IzExNTY3Rixjb2xvcjojMTE1NjdGCiAgICBzdHlsZSBEUCBmaWxsOiNFOEY0RkQsc3Ryb2tlOiMxMTU2N0YsY29sb3I6IzExNTY3RgogICAgc3R5bGUgREUgZmlsbDojRThGNEZELHN0cm9rZTojMTE1NjdGLGNvbG9yOiMxMTU2N0Y%3D" alt="Containment hierarchy of Profile, Plugin, and Skill" width="672" height="631"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skills and Plugins Sharing&lt;/strong&gt; lets you distribute Skills and Plugins within your organization with native Snowflake versioning.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is a Skill?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Overview
&lt;/h3&gt;

&lt;p&gt;A Skill is the smallest unit for injecting domain knowledge and procedures into the AI agent. It's a single &lt;code&gt;SKILL.md&lt;/code&gt; Markdown file that contains workflows and instructions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-skill/
  SKILL.md         ← required
  reference.md     ← optional (supplementary info the agent can reference)
  scripts/         ← optional (helper scripts called from the skill)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A basic &lt;code&gt;SKILL.md&lt;/code&gt; looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;data-onboarding&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Guide the process of adding a new data source to the team's data platform&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# When to use this skill&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; When the user asks to add a new table or data source
&lt;span class="p"&gt;-&lt;/span&gt; When they say "I want to ingest data" or "add a new source"

&lt;span class="gh"&gt;# Steps&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Confirm the data source type (S3 / API / DB)
&lt;span class="p"&gt;2.&lt;/span&gt; Create the schema definition and a landing table in the &lt;span class="sb"&gt;`RAW`&lt;/span&gt; database
&lt;span class="p"&gt;3.&lt;/span&gt; Build the transformation layer using a Dynamic Table
&lt;span class="p"&gt;4.&lt;/span&gt; Set up data quality checks (NOT NULL, unique constraints)
&lt;span class="p"&gt;5.&lt;/span&gt; Notify the team's Slack channel when complete
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How to invoke
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Type &lt;code&gt;/&lt;/code&gt; in chat and pick from the skill list&lt;/li&gt;
&lt;li&gt;Explicitly invoke with &lt;code&gt;$&amp;lt;skill-name&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The agent auto-invokes when user input semantically matches the &lt;code&gt;description&lt;/code&gt; field&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Auto-invocation fires when the agent matches the trigger conditions in &lt;code&gt;description&lt;/code&gt; against what the user typed. For explicit invocation, use &lt;code&gt;/skill&lt;/code&gt; or &lt;code&gt;$&amp;lt;skill-name&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Management
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CoCo Desktop&lt;/strong&gt;: Agent Settings panel → Skills.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CoCo CLI&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cortex skill list              &lt;span class="c"&gt;# list available skills&lt;/span&gt;
cortex skill add &amp;lt;path&amp;gt;        &lt;span class="c"&gt;# add from local path / GitHub URL / Stage path&lt;/span&gt;
cortex skill publish ./my-skill &lt;span class="nt"&gt;--to-stage&lt;/span&gt; @MY_DB.MY_SCHEMA.MY_STAGE/skills/

&lt;span class="c"&gt;# After logging in to CoCo&lt;/span&gt;
/skill              &lt;span class="c"&gt;# list available skills&lt;/span&gt;
/skill-development  &lt;span class="c"&gt;# invoke the skill for building new skills&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Where skills live and their priority
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Location&lt;/th&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Project&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.cortex/skills/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Workspace only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.snowflake/cortex/skills/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shared across all workspaces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bundled&lt;/td&gt;
&lt;td&gt;Built into the app&lt;/td&gt;
&lt;td&gt;Read-only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;Under cache directory&lt;/td&gt;
&lt;td&gt;Fetched from remote&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Catalog&lt;/td&gt;
&lt;td&gt;Snowflake-managed&lt;/td&gt;
&lt;td&gt;Shared within the account&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  When to use
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You want a specific business procedure to run the same way every time&lt;/li&gt;
&lt;li&gt;You want to share know-how with teammates in a reproducible form&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What is a Plugin?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Overview
&lt;/h3&gt;

&lt;p&gt;A Plugin is an "extension unit" that bundles Skills, Hooks, MCP servers, and subagents into a single directory. Install it once and all related components become active.&lt;/p&gt;

&lt;p&gt;A couple of terms worth knowing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hook&lt;/strong&gt;: a script that runs automatically at specific events (e.g., before or after a tool call)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP server&lt;/strong&gt;: an external tool integration server following the Model Context Protocol (used for GitHub, Jira, etc.)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-plugin/
  .cortex-plugin/
    plugin.json   ← manifest (required)
  skills/
    my-skill/
      SKILL.md
  agents/
    my-agent.md
  .hooks.json     ← optional
  .mcp.json       ← optional
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The manifest looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my-plugin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Plugin for custom workflows"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"skills"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"skills"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;skills&lt;/code&gt; field takes the name of the directory where Skills are stored (default: &lt;code&gt;skills/&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Management
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CoCo Desktop&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Agent Settings panel → Plugins. You can add plugins via:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local folder&lt;/strong&gt;: specify a directory that has &lt;code&gt;.cortex-plugin/plugin.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: use &lt;code&gt;owner/repo&lt;/code&gt; format (SSH, GitLab, and Bitbucket also work)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Catalog&lt;/strong&gt;: import using a &lt;code&gt;snow://skill_catalog/...&lt;/code&gt; URI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;CoCo CLI&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cortex plugin list             &lt;span class="c"&gt;# list installed plugins&lt;/span&gt;
cortex plugin add owner/repo   &lt;span class="c"&gt;# install from GitHub&lt;/span&gt;
cortex plugin add ./my-plugin  &lt;span class="c"&gt;# install from local folder&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  When to use
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You want to distribute a set of Skills, Hooks, and MCP servers together as a package&lt;/li&gt;
&lt;li&gt;You want to bundle the full extension environment for a customer demo or a specific engagement&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What is a Profile?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Overview
&lt;/h3&gt;

&lt;p&gt;A Profile is the top-level configuration package. It combines Skills, MCP servers, Hooks, Plugins, a system prompt, environment variables, settings overrides, and permission rules into one unit. Profiles can be distributed remotely from a Snowflake Stage or GitHub and applied in bulk per team or role.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;skillRepos&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Skills (distributed from Stage / GitHub)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mcpServers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MCP server configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;systemPromptRepo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Custom system prompt (&lt;code&gt;AGENTS.md&lt;/code&gt;, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hooks&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Lifecycle hooks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;plugins&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Plugin references (plugins distributed via Profile appear as &lt;code&gt;origin: profile&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;envVars&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Environment variables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;settingsOverrides&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CoCo settings overrides (second in priority after Managed Settings)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;permissions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Permission rules (&lt;code&gt;deny&lt;/code&gt; / &lt;code&gt;onlyAllow&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Security model
&lt;/h3&gt;

&lt;p&gt;Profile sits second in CoCo's settings priority hierarchy, right after Managed Settings (org-level policy):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Managed Settings (restrictions) &amp;gt; Profile overrides &amp;gt; Project Settings &amp;gt; Managed defaults &amp;gt; User Settings &amp;gt; defaults
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without going into Managed Settings in detail, the key constraints on Profile permission rules are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Profile cannot grant access that Managed Settings has explicitly denied&lt;/li&gt;
&lt;li&gt;A Profile cannot expand the Managed Settings allowlist&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A Profile can only restrict access further — not expand it&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, admins set the security boundary in Managed Settings, and Profiles layer role-specific restrictions within that boundary.&lt;/p&gt;

&lt;h3&gt;
  
  
  Management
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CoCo Desktop&lt;/strong&gt;: Agent Settings panel → Profiles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CoCo CLI&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Publish a Profile to Stage (--skill-stage specifies the Stage for Skills distribution)&lt;/span&gt;
cortex profile publish data-analyst &lt;span class="nt"&gt;--skill-stage&lt;/span&gt; @MY_DB.MY_SCHEMA.MY_STAGE/skills/

&lt;span class="c"&gt;# Switch Profile&lt;/span&gt;
&lt;span class="c"&gt;# Use the /profile command to switch interactively&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Setting an org-wide default&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;In the org's Managed Settings (&lt;code&gt;managed-settings.json&lt;/code&gt;), set &lt;code&gt;defaults.profileName&lt;/code&gt; to configure a default Profile for all users. Individual users can still override this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"defaults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"profileName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"data-analyst"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; As of July 2026, Profile is available in both CoCo CLI and CoCo Desktop, but there is no dedicated documentation page yet. The behavior described here may change significantly at general release — avoid using Profile in production for now.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  When to use
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You want to distribute a complete set of Skills + MCP + Prompt + permission restrictions per role (sales, engineering, analytics)&lt;/li&gt;
&lt;li&gt;You want to switch connections, models, and settings per engagement&lt;/li&gt;
&lt;li&gt;You're an admin applying role-specific feature restrictions within a security boundary&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Skills and Plugins Sharing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The problem with previous sharing methods
&lt;/h3&gt;

&lt;p&gt;Before this feature, sharing Skills and Plugins with a team meant using Git repos or Snowflake Stages. Git worked but required managing repo access permissions, and distributing to team members unfamiliar with Git was cumbersome. Stage-based sharing could use Snowflake roles for access control, but had no version management or catalog browsing.&lt;/p&gt;

&lt;p&gt;Skills and Plugins Sharing, added in 2026, addresses these problems. Skills and Plugins are managed natively in Snowflake, available as a Preview Feature in all accounts.&lt;/p&gt;

&lt;p&gt;From Snowsight's Horizon Catalog → Skills &amp;amp; Plugins page, you can search and manage all shared Skills and Plugins in your account.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5ihu4mor9nlv7reabtjl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5ihu4mor9nlv7reabtjl.png" alt="Snowsight Skills &amp;amp; Plugins catalog list view showing type, author, and certification filters" width="800" height="582"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works
&lt;/h3&gt;

&lt;p&gt;Skills and Plugins registered in the catalog are stored in your Snowflake account as &lt;code&gt;CORTEX EXTENSION&lt;/code&gt; objects. Like TABLE or FUNCTION, &lt;code&gt;CORTEX EXTENSION&lt;/code&gt; is a DDL object in Snowflake, and access is managed with GRANT — no Git permission setup required.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CORTEX EXTENSION (TYPE=SKILL or TYPE=PLUGIN)
  └── versioned storage
  └── access control via Snowflake roles
  └── referenced via snow://skill_catalog/... URI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Cortex Extension objects are stored by default in the &lt;code&gt;SKILL_SHARING&lt;/code&gt; schema of your personal DB (auto-created by Snowflake).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Sharing options: access and discoverability
&lt;/h3&gt;

&lt;p&gt;Two concepts control sharing, and they're &lt;strong&gt;independent&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;What it controls&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Access (RBAC)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Which roles can install and use the Skill or Plugin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Discoverability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Whether it appears in catalog search&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Combining these gives two sharing styles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Private sharing&lt;/strong&gt;: turn discoverability off and share the catalog link with specific roles only. It won't appear in search, but anyone with the link can access it (think "unlisted video").&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Role / PUBLIC sharing&lt;/strong&gt;: grant access to a role + enable discoverability, so the Skill or Plugin is findable in the catalog.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Publishing to the catalog
&lt;/h3&gt;

&lt;h4&gt;
  
  
  From CoCo Desktop
&lt;/h4&gt;

&lt;p&gt;For a Skill:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent Settings → Skills, select the skill&lt;/li&gt;
&lt;li&gt;Click "Publish to Skills Catalog" (the cloud upload icon)&lt;/li&gt;
&lt;li&gt;The workflow runs automatically and returns a &lt;code&gt;snow://skill_catalog/...&lt;/code&gt; URI&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a Plugin:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent Settings → Plugins, select the plugin&lt;/li&gt;
&lt;li&gt;Click "Publish to Plugins Catalog"&lt;/li&gt;
&lt;li&gt;Same flow — returns a &lt;code&gt;snow://skill_catalog/...&lt;/code&gt; URI&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  From CoCo in Snowsight
&lt;/h4&gt;

&lt;p&gt;Just type &lt;code&gt;Share skill &amp;lt;skill-name&amp;gt;&lt;/code&gt; in chat to start sharing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; As of July 2026, sharing Plugins from CoCo in Snowsight is not yet supported.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  From CoCo CLI
&lt;/h4&gt;

&lt;p&gt;In CoCo CLI, invoke the &lt;code&gt;/share-skill-and-plugin&lt;/code&gt; skill to publish to the catalog:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /share-skill-and-plugin my-skill
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CoCo will confirm the target role (default: PUBLIC) and discoverability (default: enabled), then return the &lt;code&gt;snow://skill_catalog/...&lt;/code&gt; URI on completion. You can also use the &lt;code&gt;/skill&lt;/code&gt; command and select the share option for a specific skill.&lt;/p&gt;

&lt;p&gt;Only Skills and Plugins you created locally can be published. Items already imported from the catalog cannot be re-published.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;code&gt;cortex skill publish --to-stage&lt;/code&gt; distributes files to a Snowflake Stage. This is separate from registering to the catalog (CORTEX EXTENSION) — don't confuse the two.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Importing from the catalog
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CoCo Desktop&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Search for the target in Snowsight's Horizon Catalog → Skills &amp;amp; Plugins&lt;/li&gt;
&lt;li&gt;Copy the &lt;code&gt;snow://skill_catalog/...&lt;/code&gt; URI&lt;/li&gt;
&lt;li&gt;Agent Settings → Skills (or Plugins) → &lt;code&gt;+&lt;/code&gt; → "Add from Skills Catalog"&lt;/li&gt;
&lt;li&gt;Paste the URI and import&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;CoCo CLI&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cortex skill add snow://skill_catalog/MY_DB.MY_SCHEMA.MY_SKILL/versions/version&lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;URI format is &lt;code&gt;snow://skill_catalog/DB.SCHEMA.EXTENSION_NAME&lt;/code&gt; (dot-separated, not slashes)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;version$1&lt;/code&gt; refers to the first published version&lt;/li&gt;
&lt;li&gt;If you omit the version, the latest certified version is used when one exists, otherwise the latest version&lt;/li&gt;
&lt;li&gt;Imported Skills and Plugins get a &lt;code&gt;CATALOG&lt;/code&gt; badge and can be updated with the &lt;code&gt;Sync&lt;/code&gt; button or these commands:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Updating via CoCo CLI&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Update a specific Skill (provide the snow:// URI)&lt;/span&gt;
cortex skill update snow://skill_catalog/MY_DB.MY_SCHEMA.MY_SKILL

&lt;span class="c"&gt;# Update a specific Plugin&lt;/span&gt;
cortex plugin update my-plugin

&lt;span class="c"&gt;# Update all installed Plugins at once&lt;/span&gt;
cortex plugin update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Catalog vs. Stage: which to use
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Skills Catalog&lt;/th&gt;
&lt;th&gt;Stage-based&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Version management&lt;/td&gt;
&lt;td&gt;Yes (CORTEX EXTENSION)&lt;/td&gt;
&lt;td&gt;No (file overwrite)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Catalog browsing&lt;/td&gt;
&lt;td&gt;Searchable in Snowsight&lt;/td&gt;
&lt;td&gt;Direct path only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access control&lt;/td&gt;
&lt;td&gt;Snowflake roles&lt;/td&gt;
&lt;td&gt;Snowflake roles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git required&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fine-grained file control&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The catalog is the right choice when your team needs version management and catalog browsing. Stage-based distribution suits teams already running a Stage workflow or needing fine-grained file-level control.&lt;/p&gt;

&lt;h3&gt;
  
  
  Governance
&lt;/h3&gt;

&lt;p&gt;Users with ACCOUNTADMIN can manage all Skills and Plugins in the account from the Snowsight &lt;strong&gt;Horizon Catalog → Skills &amp;amp; Plugins&lt;/strong&gt; page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3a6dm7vrj6hv9ji07kmg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3a6dm7vrj6hv9ji07kmg.png" alt="Skill detail view showing version selection, certification status, access settings, and telemetry (28-day install and usage counts)" width="800" height="582"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; As of July 30, 2026, only Skills can be previewed in the catalog. Plugin contents are not visible from the catalog UI.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Certify&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Certify a version and add a Certified badge. Users see the latest certified version first.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Change access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Change which roles can install and use it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Change discoverability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Toggle visibility in catalog search.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Change owner&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reassign ownership of the Cortex Extension object.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Delete&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Remove the Skill or Plugin from the catalog.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;View telemetry&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;View 28-day install and usage counts.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When you perform a governance action for the first time, you'll be prompted to select a database where governed objects will be stored. After that, all governed objects are centrally managed in that database (separate from the owner's personal DB).&lt;/p&gt;

&lt;h3&gt;
  
  
  Limitations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cross-account sharing is not supported — same Snowflake account only&lt;/li&gt;
&lt;li&gt;Security scanning for Skills and Plugins is not yet available&lt;/li&gt;
&lt;li&gt;Locally created Skills and Plugins don't appear in catalog search until you explicitly publish them&lt;/li&gt;
&lt;li&gt;Export outside of Snowflake is not supported&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Use Case Scenarios
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Scenario 1: Setting Up a Customer Demo Environment
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Switch to customer A's Snowflake connection with a Profile
   → /profile switch customer-a

2. Install the full set of Skills and Hooks for customer A via a Plugin
   → Agent Settings → Plugins → Add from GitHub
   or: cortex plugin add owner/customer-a-plugin

3. Invoke a Skill to run specific procedures
   → /semantic-view (example: semantic view creation skill)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The division of labor: Profile switches the connection, Plugin assembles the tools, Skill executes the specific procedures.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario 2: Distributing a Skill to Your Team
&lt;/h3&gt;

&lt;p&gt;When you only need to share a specific workflow (e.g., a semantic view creation procedure), publishing a single Skill to the catalog or a Stage is the simplest path.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Publish to catalog (via CoCo Desktop GUI)&lt;/span&gt;
&lt;span class="c"&gt;# → share the snow://skill_catalog/... URI and distribution is done&lt;/span&gt;

&lt;span class="c"&gt;# Via Stage (CoCo CLI)&lt;/span&gt;
cortex skill publish ./my-skill &lt;span class="nt"&gt;--to-stage&lt;/span&gt; @SHARED.SKILLS.TEAM_LIBRARY/my-skill/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scenario 3: Standardizing Environments Across Teams
&lt;/h3&gt;

&lt;p&gt;For distributing different environments to multiple roles (sales, engineering, data analytics), use a Profile. It applies Skills, MCP servers, a system prompt, and connection settings all at once.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Publish role-specific Profiles (CoCo CLI)&lt;/span&gt;
cortex profile publish sales-engineer &lt;span class="nt"&gt;--skill-stage&lt;/span&gt; @SHARED.PROFILES.STAGE/se/
cortex profile publish data-analyst    &lt;span class="nt"&gt;--skill-stage&lt;/span&gt; @SHARED.PROFILES.STAGE/analyst/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Skill&lt;/strong&gt; is the smallest unit — it defines &lt;em&gt;how&lt;/em&gt; to do something&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugin&lt;/strong&gt; is a functional module bundling Skills, MCP servers, Hooks, and Agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Profile&lt;/strong&gt; is the top-level distribution package — it covers everything a Plugin provides, plus a system prompt, settings overrides, and permission restrictions tailored to a user persona&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three axes for choosing a sharing method:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Recommended approach&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Personal (workspace)&lt;/td&gt;
&lt;td&gt;Project skills (&lt;code&gt;.cortex/skills/&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Small team (Git-based)&lt;/td&gt;
&lt;td&gt;Install via GitHub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Organization-wide (Snowflake role management)&lt;/td&gt;
&lt;td&gt;Skills and Plugins Sharing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role-based environment distribution&lt;/td&gt;
&lt;td&gt;Profile + Stage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;CoCo's extension system has three layers at different levels of granularity. Choosing the right level for your use case keeps configuration simple while maximizing reusability.&lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/cortex-code-desktop/skills" rel="noopener noreferrer"&gt;Skills in CoCo Desktop (Snowflake official docs)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/cortex-code-desktop/plugins" rel="noopener noreferrer"&gt;Plugins in CoCo Desktop (Snowflake official docs)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/extensibility" rel="noopener noreferrer"&gt;CoCo CLI extensibility (Snowflake official docs)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.snowflake.com/en/user-guide/cortex-code/cortex-code-skill-plugin-sharing" rel="noopener noreferrer"&gt;Share skills and plugins (Snowflake official docs)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Promotion
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Snowflake What's New Updates on X
&lt;/h3&gt;

&lt;p&gt;I share Snowflake What's New updates on X. Follow for the latest insights:&lt;/p&gt;

&lt;h4&gt;
  
  
  English Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_en" rel="noopener noreferrer"&gt;Snowflake What's New Bot (English Version)&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Japanese Version
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://x.com/snow_new_jp" rel="noopener noreferrer"&gt;Snowflake's What's New Bot (Japanese Version)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Change Log
&lt;/h2&gt;

&lt;p&gt;(20260804) Initial post&lt;/p&gt;

&lt;h2&gt;
  
  
  Original Japanese Article
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://zenn.dev/snowflakejp/articles/cortex_code_skill_plugin_profile" rel="noopener noreferrer"&gt;Snowflake CoCo (Cortex Code) の Skill・Plugin の違いと使い分け、共有方法&lt;/a&gt;&lt;/p&gt;

</description>
      <category>snowflake</category>
      <category>ai</category>
      <category>llm</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
