Liquibase执行Snowflake update报错:会话无当前数据库无法建表
问题现象
执行Liquibase Snowflake更新命令时,已在JDBC URL中配置数据库、schema参数,仍返回会话无当前数据库的报错,无法创建DATABASECHANGELOGLOCK锁表。
使用的执行命令:
liquibase --username=myusername --password=mypassword --url="jdbc:snowflake://myserver-name-europe.azure.snowflakecomputing.com/?db=mydb&schema=public" --changelog-file=/samplechangelog.snowflake.sql update
返回报错信息:
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))]
报错截图:
相同命令格式在其他Snowflake账号可正常运行,仅替换服务地址与数据库名后触发该问题。
触发原因
该问题通常由三类原因触发:
- JDBC参数解析异常:部分版本的Liquibase、Snowflake JDBC驱动对URL参数的解析逻辑存在兼容问题,仅传
db、schema参数时,要么会被&截断导致参数未传递到驱动,要么因缺少warehouse、role必填参数导致会话上下文初始化失败,配置的库表信息被静默丢弃。 - 账号权限不足:新账号下连接使用的用户默认角色,对URL中指定的数据库没有
USAGE权限时,Snowflake不会直接抛出权限错误,只会静默忽略URL中的数据库配置,回退到无绑定数据库的会话状态,最终触发建表报错。 - 标识符匹配失败:Snowflake对未加双引号的标识符默认按大写存储匹配,如果实际数据库/schema名称包含小写、特殊字符,URL中直接传小写名称会匹配不到对应对象,导致数据库绑定失败。
解决步骤
按优先级从高到低排查即可解决:
- 补全JDBC URL必填参数,替换参数缩写为官方标准写法
不要只传db和schema,必须补上计算仓库、角色参数,避免会话初始化失败,参考格式:
注意:参数里的数据库、schema、仓库、角色名称要和Snowflake控制台里的实际大小写完全匹配,未加双引号创建的对象全部填大写。jdbc:snowflake://myserver-name-europe.azure.snowflakecomputing.com/?warehouse=你的计算仓库名称&db=MYDB&schema=PUBLIC&role=你的用户绑定的有权限的角色名 - 显式指定Liquibase的默认库、schema参数,绕开URL解析bug
不要完全依赖JDBC URL传递库表信息,在Liquibase命令中增加显式配置,让Liquibase在连接建立后主动执行USE DATABASE、USE SCHEMA语句绑定上下文,调整后命令参考:
其中liquibase \ --username=myusername \ --password=mypassword \ --url="jdbc:snowflake://myserver-name-europe.azure.snowflakecomputing.com/?warehouse=YOUR_WAREHOUSE&db=MYDB&schema=PUBLIC&role=YOUR_ROLE" \ --default-catalog-name=MYDB \ --default-schema-name=PUBLIC \ --changelog-file=/samplechangelog.snowflake.sql \ update--default-catalog-name对应Snowflake的数据库层级,显式配置后可完全规避URL参数解析丢失的问题。 - 验证账号权限
用同账号密码登录SnowSQL或网页控制台,手动执行以下语句验证权限:
如果执行USE ROLE 你配置的角色名; USE DATABASE MYDB; USE SCHEMA PUBLIC; CREATE TABLE TMP_PERM_CHECK (ID INT); DROP TABLE TMP_PERM_CHECK;USE DATABASE阶段就报错,说明角色缺少对应权限,找账号管理员执行赋权语句即可:GRANT USAGE ON DATABASE MYDB TO ROLE 你的角色名; GRANT USAGE ON SCHEMA MYDB.PUBLIC TO ROLE 你的角色名; GRANT CREATE TABLE ON SCHEMA MYDB.PUBLIC TO ROLE 你的角色名; - 修复版本兼容问题
如果使用的Liquibase Snowflake扩展版本低于4.4.0,搭配3.13+版本的Snowflake JDBC驱动时,会出现连接参数丢失的已知bug,要么升级Liquibase到最新稳定版,要么将Snowflake JDBC驱动降级到3.12.x版本即可修复。
内容的提问来源于stack exchange,提问作者Mohamed.Radwan -MVP
相关产品推荐
相关产品推荐

