none
【SqlServer2016】テンポラルテーブル解除後に期間列だけを削除しようとするとエラーになって削除出来ない。【SqlServerエラー:13588】 RRS feed

  • 質問

  • いつもお世話になっております。
    SqlServer2016の新機能であるテンポラルテーブルについて実験をしていました。

    ALTER TABLE T_Test
      ADD   
        SysStartTime datetime2 GENERATED ALWAYS AS ROW START HIDDEN    
               CONSTRAINT Df_SysStartTime DEFAULT SYSUTCDATETIME()  
      , SysEndTime   datetime2 GENERATED ALWAYS AS ROW END HIDDEN    
               CONSTRAINT Df_SysEndTime   DEFAULT CONVERT(datetime2(0), '9999-12-31 23:59:59')
      , PERIOD FOR SYSTEM_TIME (SysStartTime,SysEndTime)
    ;   
    ALTER TABLE T_Test SET (SYSTEM_VERSIONING = ON)
    ;  

    既存テーブル(T_Test)に対して上記を行い、期間列(SysStartTime,SysEndTime)を追加、
    続いてSYSTEM_VERSIONING=ONを行い、テンポラルテーブル化しました。

    ここで一旦、元に戻そうと、

    ALTER TABLE T_Test SET (SYSTEM_VERSIONING = OFF)

    上記を行ってテンポラルテーブル無効化後、
    既存テーブル(T_Test)に追加した期間列のSysStartTimeを削除しようと、

    ALTER TABLE T_Test DROP COLUMN SysStartTime

    上記を実行しましたが以下のエラーが出てしまい削除出来ません。

    --------------------------------------------------------------------
    列 'SysStartTime' の削除に失敗しました。  (Microsoft.SqlServer.Smo)
    テーブル 'SampleDB.dbo.T_Test' の列 'SysStartTime' は、
    期間の定義の一部であるため、削除できません。 (Microsoft SQL Server、エラー: 13588)
    --------------------------------------------------------------------

    SysStartTime、SysEndTimeどちらでやっても同じエラー

    履歴テーブル側のインデックスを削除後、履歴テーブル側のSysStartTimeを削除してから
    既存テーブルのSysStartTimeを削除しても同じエラー、

    履歴テーブルそのものを削除してから既存テーブルのSysStartTimeを削除しても同じエラー....。

    既存テーブルそのものの削除は出来るのですが、既存テーブルに追加した期間列だけの削除が出来ません。

    試しに、ALTER TABLE T_Test DROP CONSTRAINT Df_SysStartTimeも実行してみましたが、
    「3728:'Df_SysStartTime' は制約ではありません。」というエラーが返ります....。


    どうしたら追加した列だけを削除出来るのでしょうか?
    やはりDrop Tableしかないのでしょうか?

    2016年10月13日 5:00

回答

  • 自己解決しました。失礼しました。。。

    システム バージョン管理されたテンポラル テーブルでシステム バージョン管理を停止する
    https://msdn.microsoft.com/ja-jp/library/mt591015.aspx

    期間列を完全に削除するには、SYSTEM_TIME 期間を削除すれば良かったんですね。。
    ちゃんとMSDNを調べれば良かったです。。。

    ALTER TABLE xxxx DROP PERIOD FOR SYSTEM_TIME


    2016年10月13日 7:08