我正在编写一个 dbatools 脚本,用于从数据库模式中导出各种项目。使用Export-DbaScript时,表、索引、PK/FK 按预期转储。
但是,表的顺序及其约束以错误的顺序转储。例如,表 Foo 与 FK 约束一起转储到一个直到脚本稍后才出现的表。这会导致转储无法执行。
请注意,这可能也适用于 SMO API,因为据我所知 dbatools 基本上是一个包装器。我还试图摆弄各种 ScriptingOptions,但没有运气。
示例伪脚本:
$schemaTables = Get-DbaDbTable -SqlInstance $serverInstance -Database $database -Schema $schema
# Set options, and dump to file
$options = New-DbaScriptingOption
$options.ContinueScriptingOnError = $false
$options.DriAllConstraints =$true
$schemaTables | Export-DbaScript -FilePath $schemaFile -ScriptingOptionsObject $options -EnableException
示例输出,其中 BAR 在 FK_FOO_BAR 约束之后创建:
CREATE TABLE [acme].[FOO](
[ID] [uniqueidentifier] NOT NULL,
[dateFrom] [datetime2](7) NOT NULL,
[dateTo] [datetime2](7) NULL,
--- ...and so forth
CONSTRAINT [R161_pk] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 75, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [acme].[FOO] WITH CHECK ADD CONSTRAINT [FK_FOO_BAR] FOREIGN KEY([ID])
REFERENCES [acme].[BAR] ([fooID])
ALTER TABLE [acme].[FOO] CHECK CONSTRAINT [FK_FOO_BAR]
---- BAR created after FK_FOO_BAR, stuff breaks
CREATE TABLE [acme].[BAR](
[fooID] [uniqueidentifier] NOT NULL,
[teamName] [nvarchar](50) COLLATE Danish_Norwegian_CI_AS NULL,
--- ...and so forth
CONSTRAINT [PK_PTRLICENCE] PRIMARY KEY CLUSTERED
(
[fooID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
我还没有尝试过的一件事是遍历表集合,并为每个表调用 .Script() ,然后再次运行并最终为约束调用 .Script() .. 但我希望 SMO / dbatools 可以处理这个问题。