Snowflake部署代码时Liquibase报无当前schema错误如何解决
核心报错信息如下:
Unexpected error running Liquibase: Cannot perform CREATE TABLE. This session does not have a current schema. Call 'USE SCHEMA', or use a qualified name. [Failed SQL: (90106) CREATE TABLE DATABASECHANGELOGLOCK (ID INT NOT NULL, LOCKED BOOLEAN NOT NULL, LOCKGRANTED TIMESTAMP_NTZ, LOCKEDBY VARCHAR(255), CONSTRAINT PK_DATABASECHANGELOGLOCK PRIMARY KEY (ID))]
手动执行USE SCHEMA、使用完全限定名仍无法解决的场景,按以下步骤逐一排查修复:
1. 显式配置Liquibase连接的默认schema
手动执行的USE SCHEMA只在当前交互会话生效,Liquibase部署时会创建独立的新会话,不会继承手动操作的会话上下文,必须在连接配置层指定默认schema:
- JDBC连接串方式:在连接URL末尾直接拼接库、schema、仓库、角色参数,示例:
jdbc:snowflake://<你的Snowflake账号标识>.snowflakecomputing.com/?db=<目标数据库名>&schema=<目标schema名>&warehouse=<使用的计算仓库名>&role=<连接使用的角色名> - 配置文件方式:在Liquibase配置项中显式指定默认schema,Spring集成场景配置示例:
原生Liquibase配置项为spring: liquibase: default-schema: <目标schema名>liquibase.defaultSchema,直接在配置文件中赋值即可。
2. 校验连接角色的schema权限
连接使用的角色缺少目标schema的对应权限时,也会触发同类报错,执行以下SQL赋权即可:
GRANT USAGE ON SCHEMA <目标数据库名>.<目标schema名> TO ROLE <连接使用的角色名>; GRANT CREATE TABLE ON SCHEMA <目标数据库名>.<目标schema名> TO ROLE <连接使用的角色名>;
3. 配置changelog全局Liquibase表schema
如果未在changelog中指定Liquibase系统表(DATABASECHANGELOGLOCK、DATABASECHANGELOG)的存储schema,Liquibase生成系统表DDL时不会自动拼接schema前缀,需在changelog根节点添加全局属性:
<databaseChangeLog> <property name="liquibaseSchemaName" value="<目标schema名>"/> <!-- 其余changelog配置 --> </databaseChangeLog>
4. 校验部署流程的会话一致性
如果部署脚本存在多步会话切换、连接重置逻辑,确认schema设置操作和Liquibase执行操作在同一个会话上下文中,避免出现A会话设置schema、B会话执行部署的情况。
内容的提问来源于stack exchange,提问作者Sonal

