首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dbatools (或SQL Server的SMO )-模式导出期间的表排序

dbatools (或SQL Server的SMO )-模式导出期间的表排序
EN

Stack Overflow用户
提问于 2021-10-19 19:07:52
回答 1查看 61关注 0票数 0

我正在编写一个dbatools脚本,用于从数据库模式中导出各种项目。使用Export-DbaScript时,表、索引、PK/FK会按预期转储。

然而,表的顺序和它的约束被以错误的顺序转储。例如,使用FK约束将表Foo转储到一个直到脚本中稍后才出现的表。这会导致转储在执行时无用。

请注意,这可能也适用于SMO API,因为据我所知,dbatools基本上是一个包装器。我还试着摆弄各种ScriptingOptions,但没有成功。

伪脚本示例:

代码语言:javascript
复制
$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约束之后创建:

代码语言:javascript
复制
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能处理这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-20 10:16:16

回答我自己的问题:我假设Export-DbaScript根据configuration对象来处理这个问题。事实并非如此,因此导出必须在两次迭代中完成:首先是表对象,然后是FK。

示例代码:

代码语言:javascript
复制
# Export tables plainly without FK etc
$options = New-DbaScriptingOption
$options.ContinueScriptingOnError = $false
$options.DriIndexes = $true
$options.SpatialIndexes = $true
$options.DriPrimaryKey = $true
$tablesAll | Export-DbaScript -FilePath $schemaFile -ScriptingOptionsObject $options -EnableException -NoPrefix

# Export table foreign keys, triggers etc (must be done after table definitions)  
$options = New-DbaScriptingOption
$options.ContinueScriptingOnError = $false
$options.PrimaryObject = $false
$options.DriForeignKeys = $true
$options.Triggers = $true;
$tablesAll | Export-DbaScript -FilePath $schemaFile -ScriptingOptionsObject $options -EnableException -Append -NoPrefix
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69636438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档