【发布时间】: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