none
外部参照されているテーブルの強制的削除方法について RRS feed

  • 質問

  • Excel で作ったDBスキーマ表から、SQLScriptを生成する簡単なマクロを作っています。
    Create Table 記述前に、Drop Table を記述しようと思っているのですが、
    外部参照キーがネックで、どうしようかと悩んでいます。

     

    外部参照されているテーブルをDropしようとすると、

     

    オブジェクト 'テーブル名' を削除できませんでした。このオブジェクトは、FOREIGN KEY 制約で参照されています。

     

    というエラーになります。

    もちろんデータの整合性を考えると、先に Foreign key を削除してから Drop すべきですが、
    そうなると、まず Drop したいテーブルにどんな外部参照キーが張られているかチェックし、
    その全ての参照しているテーブルから外部参照キーを削除しなければいけません。

     

    Postgres では Drop table テーブル名 cascade
    という記述で、制約を無視して強制的に削除できる構文があるようなのですが、
    SQL Server でも同じようなものがあるのでしょうか?

     

    作成しているものの性質上、Excel マクロ内でDB参照しに行くことはありません。
    Script を生成するだけなので、そのScript内記述で、Drop Table の前に、
    外部参照キーのチェック、あったら削除、の記述をする必要があります。

     

    悩んだ末、Drop Table するのに、カーソル使うという大げさなコードになってしまいました。

    なにかもっとスマートな方法があるのでしょうか?
    アドバイス頂ければ、助かります。
    よろしくお願いいたします。

     

    ---------------------------------
    declare @fkeyname varchar(100)
    declare @tablename_moto varchar(100)
    declare @tablename_flg int
    set @tablename_flg = 0
    DECLARE csr_temp CURSOR LOCAL FOR
    select o.name, f.name from sys.foreign_keys f inner join sys.objects o
    on f.parent_object_id = o.object_id
    where f.referenced_object_id=OBJECT_ID(N'tablename_drop')
    OPEN csr_temp
     FETCH Next FROM csr_temp INTO @tablename_moto, @fkeyname
    while(@@FETCH_STATUS = 0)
    begin
     if @@FETCH_STATUS  < 0
      break
     else
     begin
      set @tablename_flg = 1
      execute( 'ALTER TABLE ' + @tablename_moto + ' DROP CONSTRAINT ' + @fkeyname)
     end
     FETCH Next FROM csr_temp INTO @tablename_moto, @fkeyname
    end
    CLOSE csr_temp
    DEALLOCATE csr_temp

    Drop Table tablename_drop
    ---------------------------------

    2007年9月5日 13:19