如何在 SQL 脚本中对查询执行进行排序,以便它们以正确的顺序执行?

How to order queries execution in SQL script so that they are executed in the right order?

假设我有三个表:

Table References
A -
B A
C B

并且我已经使用这些表的定义创建了一个 SQL DDL 脚本:

script.sql:

CREATE TABLE C(...REFERENCES B...)
CREATE TABLE A(...)
CREATE TABLE B(...REFERENCES A...) 

重要提示:脚本中定义的顺序可以是随机的!

是否有 way/tool 将脚本作为输入和 return 另一个 SQL 带有排序 DDL 查询的脚本?

示例:

输入scriptInput.sql:

CREATE TABLE B(...REFERENCES A...)   
CREATE TABLE A(...)
CREATE TABLE C(...REFERENCES B...)

输出 - scriptOutput.sql:

CREATE TABLE A(...)
CREATE TABLE B(...REFERENCES A...) 
CREATE TABLE C(...REFERENCES B...)

典型的解决方案是将 table 创建与约束创建分离。例如,您的脚本可能如下所示:

CREATE TABLE C(...);
CREATE TABLE A(...);
CREATE TABLE B(...);

alter table c add constraint fk1 foreign key (x) references b (y);
alter table b add constraint fk2 foreign key (z) references a (w);

这就是 production-grade 脚本的典型创建方式。这是万无一失的,因为不同的人(DBA 角色)将在生产环境中执行脚本,并且会在不尝试改进脚本的情况下执行脚本。如果成功(或错误),DBA 会将执行日志返回给您。

有一个使用超级指令CREATE SCHEMA 的解决方案。 当然,您需要使用特定的模式来做到这一点。不是丑陋的 dbo 架构。示例:

CREATE SCHEMA SCH_TEST
CREATE TABLE B(PK_B INT PRIMARY KEY, FK_A INT REFERENCES A (PK_A))   
CREATE TABLE A(PK_A INT PRIMARY KEY)
CREATE TABLE C(PK_C INT PRIMARY KEY, FK_B INT REFERENCES B (PK_B))
;

就这些!

它来自标准 ISO SQL 语言...