如何在 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 语言...
假设我有三个表:
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 语言...