助けてください!設定したパーティションからの切り替え中にエラーが発生しました。以下のスクリプトとエラー情報があります。
範囲ごとに個別のファイルグループを作成しました
-パーティション関数の作成
USE [ApplicationLogs]
GO
CREATE PARTITION FUNCTION [FN_SchedulerLog](datetime) AS RANGE LEFT FOR VALUES (N'2016-06-30T23:59:59.998', N'2016-07-31T23:59:59.998', N'2016-08-31T23:59:59.998', N'2016-09-30T23:59:59.998', N'2016-10-31T23:59:59.998', N'2016-11-30T23:59:59.998', N'2016-12-31T23:59:59.998')
--Create Parttion SCHEME
CREATE PARTITION SCHEME [sch_SchedulerLog] AS PARTITION [FN_SchedulerLog] TO ([FG_SchedulerLog_06_16], [FG_SchedulerLog_07_16], [FG_SchedulerLog_08_16], [FG_SchedulerLog_09_16], [FG_SchedulerLog_10_16], [FG_SchedulerLog_11_16], [FG_SchedulerLog_12_16], [PRIMARY])
DROP INDEX [pkSchedulerLogId] ON [dbo].[SchedulerLog] WITH ( ONLINE = OFF )
CREATE UNIQUE NONCLUSTERED INDEX [pkSchedulerLogId] ON [dbo].[SchedulerLog]
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
CREATE CLUSTERED INDEX [ClusteredIndex_on_sch_SchedulerLog_636102140668795637] ON [dbo].[SchedulerLog]
(
[Date]
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [sch_SchedulerLog]([Date])
DROP INDEX [ClusteredIndex_on_sch_SchedulerLog_636102140668795637] ON [dbo].[SchedulerLog] WITH ( ONLINE = OFF )
--- switching out data from any FGs to a switchout table for archiving purposes
--******************
--Create a switch out table:
USE [ApplicationLogs]
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [dbo].[staging_SchedulerLog_20160923-120700](
[ID] [int] NOT NULL,
[Date] [datetime] NOT NULL,
[Thread] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[HostName] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[HostIP] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[ModuleName] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[Level] [varchar](20) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[Logger] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[Message] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
) ON [FG_SchedulerLog_06_16]
USE [ApplicationLogs]
CREATE UNIQUE NONCLUSTERED INDEX [staging_SchedulerLog_20160923-120700_pkSchedulerLogId] ON [dbo].[staging_SchedulerLog_20160923-120700]
(
[ID] ASC
)WITH (PAD_INDEX = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [FG_SchedulerLog_06_16]
USE [ApplicationLogs]
ALTER TABLE [dbo].[staging_SchedulerLog_20160923-120700] WITH CHECK ADD CONSTRAINT [chk_staging_SchedulerLog_20160923-120700_partition_1] CHECK ([Date]<=N'2016-06-30T23:59:59')
ALTER TABLE [dbo].[staging_SchedulerLog_20160923-120700] CHECK CONSTRAINT [chk_staging_SchedulerLog_20160923-120700_partition_1]
---Switch out partition
ALTER TABLE [dbo].[SchedulerLog] SWITCH PARTITION 1 TO [dbo].[staging_SchedulerLog_20160923-120700];
GO
エラー:ALTER TABLE SWITCH 'ステートメントが失敗しました。テーブル 'ApplicationLogs.dbo.SchedulerLog'はパーティション化されていますが、インデックス 'staging_SchedulerLog_20160923-120700_pkSchedulerLogId'はパーティション化されていません。
すべてのページのパーティション変更アドレスをターゲットテーブルに切り替えるため、(ソーステーブルで作成された)インデックスもターゲットテーブルに移動します。テーブルで使用可能なインデックスがパーティション化されていない場合、インデックスはターゲットに移動しません。
SWITCH
パーティションを作成するときは、両方の(ソースとターゲット)テーブルに同じスキーマ(構造)、インデックス(パーティション化する必要があります)、およびCHECK制約があることを確認してください。
エラーによる
エラー:ALTER TABLE SWITCH 'ステートメントが失敗しました。テーブル 'ApplicationLogs.dbo.SchedulerLog'はパーティション化されていますが、インデックス 'staging_SchedulerLog_20160923-120700_pkSchedulerLogId'はパーティション化されていません。
インデックス[pkSchedulerLogId]はパーティション化されていません。
インデックスをパーティション分割した後
DROP INDEX [pkSchedulerLogId] ON [dbo].[SchedulerLog] WITH ( ONLINE = OFF )
CREATE UNIQUE NONCLUSTERED INDEX [pkSchedulerLogId] ON [dbo].[SchedulerLog]
(
[ID] ASC
,[Date]
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON [sch_SchedulerLog]([Date])
そして
両方のテーブルにチェック制約を追加するか
ALTER TABLE [dbo].[staging_SchedulerLog_20160923-120700] WITH CHECK ADD CONSTRAINT [chk_staging_SchedulerLog_20160923-120700_partition_1] CHECK ([Date]<=N'2016-06-30T23:59:59')
ALTER TABLE [dbo].[SchedulerLog] WITH CHECK ADD CONSTRAINT [chk_staging_SchedulerLog_20160923-120700_partition_2] CHECK ([Date]<=N'2016-06-30T23:59:59')
OR
ステージングテーブルから制約を削除します。
ALTER TABLE [staging_SchedulerLog_20160923-120700] DROP CONSTRAINT [chk_staging_SchedulerLog_20160923-120700_partition_1];
これでパーティションを切り替えることができます
ALTER TABLE [dbo].[SchedulerLog] SWITCH PARTITION 1 TO [dbo].[staging_SchedulerLog_20160923-120700];
ありがとう