【问题标题】:Oracle - Flyway DB referential dataOracle - Flyway DB 参考数据
【发布时间】:2017-10-29 23:15:16
【问题描述】:

我正在寻找在 Oracle 数据库中管理参考数据的最佳方法。我们将引用数据保存在源代码控制中,并且我们的引用表在部署过程中得到更新。

我们使用 Flyway 来部署我们的更改,并为每个参考表设置一个可重复的脚本,以确保每次部署后数据都是最新的。

在 SQL 服务器数据库中,我们创建一个 SQL 脚本,其中包含将语句插入到给定表的引用数据的变量表中,然后使用 MERGE 语句插入/更新/删除实际表。这样我们就可以管理每个分支的引用数据。

SQL Server 示例

-- temporary table to hold all data
DECLARE @product_type TABLE
(
     [id] varchar(25)
    ,[name] varchar(50) 
)

INSERT @product_type ([id], [name]) VALUES ('1', 'Product 1')
INSERT @product_type ([id], [name]) VALUES ('2', 'Product 2')
INSERT @product_type ([id], [name]) VALUES ('3', 'Product 3')

-- merge changes into table
MERGE   [PRODUCT_TYPE] AS t
USING   @product_type AS s
ON      (t.[id] = s.[id])
WHEN    MATCHED
THEN    UPDATE 
        SET t.[name] = s.[name] 
WHEN    NOT MATCHED BY TARGET
THEN    INSERT  ([id], [name]) 
        VALUES  (s.[id], s.[name]);

--delete removed product type
DELETE [PRODUCT_TYPE] 
WHERE id NOT IN (SELECT id FROM @product_type)

由于在 Oracle 中,您无法真正创建变量表甚至是短暂的临时表,我不确定除了创建一个临时表然后在最后删除它之外,什么是做类似事情的正确方法。

Oracle 示例

BEGIN
   EXECUTE IMMEDIATE 'DROP TABLE TMP__product_type';
EXCEPTION
   WHEN OTHERS THEN
      IF SQLCODE != -942 THEN
         RAISE;
      END IF;
END;
/

CREATE TABLE TMP__product_type 
(
  id VARCHAR2(25 BYTE) NOT NULL 
, name VARCHAR2(50 BYTE) 
);


INSERT INTO TMP__product_type VALUES ('1,', 'Product 1');
INSERT INTO TMP__product_type VALUES ('2,', 'Product 2');
INSERT INTO TMP__product_type VALUES ('3,', 'Product 3');

MERGE INTO product_type T
   USING (SELECT id, name FROM TMP__product_type s) S
   ON (T.id = S.id)
   WHEN MATCHED THEN 
    UPDATE SET T.name = S.name
   WHEN NOT MATCHED THEN 
    INSERT (T.id, T.name)VALUES (S.id, S.name);

DELETE FROM product_type T WHERE NOT EXISTS (SELECT s.name FROM TMP__product_type s WHERE s.name = t.name);


BEGIN
   EXECUTE IMMEDIATE 'DROP TABLE TMP__product_type';
EXCEPTION
   WHEN OTHERS THEN
      IF SQLCODE != -942 THEN
         RAISE;
      END IF;
END;
/

欢迎提出任何建议。

【问题讨论】:

    标签: oracle deployment flyway


    【解决方案1】:

    实际上将 SQL Server 方法转换为 Oracle 非常简单。使用 DUAL 模拟内存表:

    MERGE INTO product_type T
       USING (select '1' as id, 'Product 1' as name from dual union all
              select '2' as id, 'Product 2' as name from dual union all
              select '3' as id, 'Product 3'as name from dual ) S
       ON (T.id = S.id)
       WHEN MATCHED THEN 
        UPDATE SET T.name = S.name
       WHEN NOT MATCHED THEN 
        INSERT (T.id, T.name)VALUES (S.id, S.name);
    

    这不处理 DELETE。当然,您知道自己的流程,但处理此问题的最佳方法似乎是显式删除:

    delete from product_type T
    where T.id in ('4', '5');
    

    【讨论】:

    • 我更喜欢这样的解决方案,我不必单独跟踪删除,因为当涉及多个开发人员时会变得很困难。
    • 目前您正在隐式跟踪删除,通过从记录集中遗漏。不知道为什么这更容易,但就像我说的,你知道自己的流程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    相关资源
    最近更新 更多