由于此会话没有当前数据库,因此无法使用 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 驱动程序连接字符串的更多信息的页面:
我正在尝试 运行 使用 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 驱动程序连接字符串的更多信息的页面: