首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flyway:如何在创建flyway_schema_history之前创建Server数据库

Flyway:如何在创建flyway_schema_history之前创建Server数据库
EN

Stack Overflow用户
提问于 2021-08-09 06:02:23
回答 1查看 634关注 0票数 0

我们的项目使用AWS CloudFormation来设置Server实例,然后使用Flyway应用表迁移。由于尚未创建数据库(AWS在创建Server实例时不能同时创建数据库),Flyway然后在默认数据库主目录下创建flyway_schema_history,这将导致权限失败:

代码语言:javascript
复制
org.flywaydb.core.internal.sqlscript.FlywaySqlScriptException: Migration  failed
-----------------
SQL State  : S0001
Error Code : 262
Message    : CREATE TABLE permission denied in database 'master'.
Location   :  ()
Line       : 1
Statement  : CREATE TABLE [master].[guest].[flyway_schema_history] (
    [installed_rank] INT NOT NULL,
    [version] NVARCHAR(50),
    [description] NVARCHAR(200),
    [type] NVARCHAR(20) NOT NULL,
    [script] NVARCHAR(1000) NOT NULL,
    [checksum] INT,
    [installed_by] NVARCHAR(100) NOT NULL,
    [installed_on] DATETIME NOT NULL DEFAULT GETDATE(),
    [execution_time] INT NOT NULL,
    [success] BIT NOT NULL
);
ALTER TABLE [master].[guest].[flyway_schema_history] ADD CONSTRAINT [flyway_schema_history_pk] PRIMARY KEY ([installed_rank]);
CREATE INDEX [flyway_schema_history_s_idx] ON [master].[guest].[flyway_schema_history] ([success]);

    at org.flywaydb.core.internal.sqlscript.DefaultSqlScriptExecutor.handleException(DefaultSqlScriptExecutor.java:277)
    at org.flywaydb.core.internal.sqlscript.DefaultSqlScriptExecutor.executeStatement(DefaultSqlScriptExecutor.java:224)
    at org.flywaydb.core.internal.sqlscript.DefaultSqlScriptExecutor.execute(DefaultSqlScriptExecutor.java:128)
    at org.flywaydb.core.internal.schemahistory.JdbcTableSchemaHistory$1$1.call(JdbcTableSchemaHistory.java:115)
    at org.flywaydb.core.internal.jdbc.TransactionalExecutionTemplate.execute(TransactionalExecutionTemplate.java:66)
    at org.flywaydb.core.internal.schemahistory.JdbcTableSchemaHistory$1.call(JdbcTableSchemaHistory.java:111)
    at org.flywaydb.core.internal.database.sqlserver.SQLServerApplicationLockTemplate.execute(SQLServerApplicationLockTemplate.java:62)
    at org.flywaydb.core.internal.database.sqlserver.SQLServerConnection.lock(SQLServerConnection.java:96)
    at org.flywaydb.core.internal.schemahistory.JdbcTableSchemaHistory.create(JdbcTableSchemaHistory.java:101)
    at org.flywaydb.core.Flyway$1.execute(Flyway.java:217)
    at org.flywaydb.core.Flyway$1.execute(Flyway.java:172)
    at org.flywaydb.core.Flyway.execute(Flyway.java:588)
    at org.flywaydb.core.Flyway.migrate(Flyway.java:172)

在本例中,我们提供了Flyway,但没有指定数据库,只需连接到实例(即jdbc:sqlserver://db.tracking.sandbox.aws.xxx.com:1433). )。

给定AWS,CloudFormation不允许我们在创建Server实例的同时创建数据库。如果从天桥一侧有一种方法可以在天桥创建flyway_schema_history之前创建一个数据库,那么Flyway稍后将在新创建的数据库下创建flyway_schema_history。

你有办法做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-09 08:05:37

我没有自己尝试过(现在我面前没有设置),但是考虑两种方法:

  1. 在运行之前,将DB与天桥分开创建。例如,如果您正在作为脚本中的一个步骤运行天桥,则在此步骤之前运行另一个脚本。
  2. 如果您想在内部创建带有天桥的数据库,请考虑使用flyway回调--这些是天桥生命周期中各个步骤的挂钩:

更具体地说,beforeMigrate可能会完成这项工作。

请注意,您可以在SQL和Java代码中实现回调,以获得更大的灵活性。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68707452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档