由于此会话没有当前数据库,因此无法使用 Snowflake 的 Liquibase 更新执行 CREATE TABLE?

Cannot perform CREATE TABLE using Liquibase update for Snowflake as this session does not have a current database?

我正在尝试 运行 使用 Liquibase 作为以下命令更新 Snowflake,该命令具有服务器、数据库和架构的完全限定名称。

liquibase --username=myusername --password=mypassword --url="jdbc:snowflake://myserver-name-europe.azure.snowflakecomputing.com/?db=mydb&schema=public" --changelog-file=/samplechangelog.snowflake.sql update

但它只是给我错误,我没有指定我所做的数据库。 此外,相同的命令是否适用于其他 Snowflake 帐户?我什至只是从其他项目复制并粘贴它,它只是服务器的名称 URL 和 DB 是不同的。

错误信息如下:

Unexpected error running Liquibase: Cannot perform CREATE TABLE. This session does not have a current database. Call 'USE DATABASE', or use a qualified name. [Failed SQL: (90105) CREATE TABLE DATABASECHANGELOGLOCK (ID INT NOT NULL, LOCKED BOOLEAN NOT NULL, LOCKGRANTED TIMESTAMP_NTZ, LOCKEDBY VARCHAR(255), CONSTRAINT PK_DATABASECHANGELOGLOCK PRIMARY KEY (ID))]

此错误通常是由于权限不足 - 如果用户无法 'see' 数据库,liquibase 会自动将其设置为 null,然后失败并显示此错误。解决此问题的最佳方法是使用相同的凭据通过 Snowflake Web GUI 进行连接(不设置任何角色或仓库),然后尝试 运行 'use database ...'。 解决方案是直接或通过角色授予用户足够的权限(但角色名称也需要在 jdbc 连接字符串中传递)。

我建议为用户“username”设置默认角色:

ALTER USER myusername SET DEFAULT_ROLE = my_default_role;

如果用户没有分配默认仓库则:

ALTER USER myusername SET DEFAULT_WAHREOUSE = my_warehouse_name;

也可以在db.properties 文件中设置dabatabase/schema/warehouse/...。相关:Specifying Properties in a Connection Profile

是的,问题出在我尝试用来连接到 Snowflake 的当前用户的权限中,我是这样做的:

ALTER USER myuser SET DEFAULT_ROLE=SYSADMIN

这导致另一个错误,因为没有活动仓库,所以我在 JDBC 驱动程序的连接字符串中设置妓院如下:

liquibase --username=myusername --password=mypassword --url="jdbc:snowflake://myserver-name-europe.azure.snowflakecomputing.com/?&warehouse=COMPUTE_WH&db=mydb&schema=public"--changelog-file=/samplechangelog.snowflake.sql update

因此,我可以在 JDBC 的连接字符串中发送任何值,如下所示:

jdbc:snowflake://myorganization-myaccount.snowflakecomputing.com/?user=peter&warehouse=mywh&db=mydb&schema=public

这里是有关 JDBC 驱动程序连接字符串的更多信息的页面:

JDBC connection string to Snowflake