⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
秘密管理器

秘密管理器为所有使用秘密的后端提供统一的用户界面。秘密可以设置作用域,因此不同的存储前缀可以拥有不同的秘密,例如允许在单个查询中连接来自不同组织的数据。秘密也可以被持久化,这样每次启动 DuckDB 时都不需要重新指定它们。

警告:持久化秘密以未加密的二进制格式存储在磁盘上。

秘密类型

秘密是类型化的,它们的类型标识了它们所针对的服务。大多数秘密不包含在 DuckDB 默认设置中,而是由扩展注册的。目前,以下秘密类型可用

秘密类型 服务 / 协议 扩展
azure Azure Blob 存储 azure
ducklake DuckLake ducklake
gcs Google Cloud Storage httpfs
http HTTP 和 HTTPS httpfs
huggingface Hugging Face httpfs
mysql MySQL mysql
postgres PostgreSQL postgres
r2 Cloudflare R2 httpfs
s3 AWS S3 httpfs

对于每种类型,都有一个或多个“秘密提供者”,用于指定秘密如何创建。秘密还可以有一个可选的作用域,它是一个文件路径前缀,秘密将应用于该前缀。当为某个路径获取秘密时,秘密作用域会与该路径进行比较,返回与该路径匹配的秘密。如果有多个匹配的秘密,则选择最长的前缀。

创建秘密

秘密可以使用CREATE SECRET SQL 语句创建。秘密可以是临时的持久化的。默认使用临时秘密,并且在 DuckDB 实例的生命周期内存储在内存中,类似于以前设置的工作方式。持久化秘密以未加密的二进制格式存储在 ~/.duckdb/stored_secrets 目录中。在 DuckDB 启动时,持久化秘密会从该目录中读取并自动加载。

秘密提供者

要创建秘密,需要使用秘密提供者。秘密提供者是生成秘密的机制。为了说明这一点,对于 S3GCSR2AZURE 秘密类型,DuckDB 目前支持两种提供者:CONFIGcredential_chainCONFIG 提供者要求用户将所有配置信息传递给 CREATE SECRET,而 credential_chain 提供者将自动尝试获取凭据。当未指定秘密提供者时,将使用 CONFIG 提供者。有关如何使用不同提供者创建秘密的更多详细信息,请查看 httpfsazure 上的相应页面。

临时秘密

要创建用于访问 S3 的临时无作用域秘密,我们现在可以使用以下方式

CREATE SECRET my_secret (
    TYPE s3,
    KEY_ID 'my_secret_key',
    SECRET 'my_secret_value',
    REGION 'my_region'
);

请注意,我们在这里隐式使用了默认的 CONFIG 秘密提供者。

持久化秘密

为了在 DuckDB 数据库实例之间持久化秘密,我们现在可以使用 CREATE PERSISTENT SECRET 命令,例如:

CREATE PERSISTENT SECRET my_persistent_secret (
    TYPE s3,
    KEY_ID 'my_secret_key',
    SECRET 'my_secret_value'
);

默认情况下,这会将秘密(未加密)写入 ~/.duckdb/stored_secrets 目录。要更改秘密目录,请执行

SET secret_directory = 'path/to/my_secrets_dir';

请注意,设置 home_directory 配置选项的值对秘密的位置没有影响。

删除秘密

秘密可以使用DROP SECRET 语句删除,例如:

DROP PERSISTENT SECRET my_persistent_secret;

为同一服务类型创建多个秘密

如果同一服务类型存在两个秘密,可以使用作用域来决定应使用哪一个。例如

CREATE SECRET secret1 (
    TYPE s3,
    KEY_ID 'my_secret_key1',
    SECRET 'my_secret_value1',
    SCOPE 's3://my-bucket'
);
CREATE SECRET secret2 (
    TYPE s3,
    KEY_ID 'my_secret_key2',
    SECRET 'my_secret_value2',
    SCOPE 's3://my-other-bucket'
);

现在,如果用户从 s3://⟨my-other-bucket⟩/something 查询某些内容,请求将自动选择秘密 secret2。要查看正在使用哪个秘密,可以使用 which_secret 标量函数,该函数以路径和秘密类型作为参数

FROM which_secret('s3://my-other-bucket/file.parquet', 's3');

列出秘密

秘密可以使用内置的表生成函数列出,例如,通过使用duckdb_secrets() 表函数

FROM duckdb_secrets();

敏感信息将被编辑。