none
エラー RRS feed

  • 質問

  • ご教授お願い致します。

     既に客先に納品されているシステムがあります。
     要望で、テーブルの項目の桁数変更依頼がありまして
     当方の開発側で、当該テーブルの変更を行いました。
     その後、以下クエリを作成して、客先側と同期を
     行おうとしたのですが、客先側でクエリを実行したら
     エラーとなりました。エラー内容は以下の通りです。
     
     ・クエリ
     --------------------------
     use データベース名 

     ALTER TABLE dbo.テーブル名 alter column
     変更項目 float not null
     GO  
     --------------------------
     このクエリを当方の開発側で実行したら

     メッセージ 3728、レベル 16、状態 1、行 5
     'DF__テーブル名__項目名__52AF0DCA' は制約ではありません。
     メッセージ 3727、レベル 16、状態 0、行 5
     制約を削除できませんでした。以前のエラーを調べてください。

     となり
     以下のメッセージを追加しました。

     ALTER TABLE TR_受注 DROP CONSTRAINT DF__テーブル名__項目名__52AF0DCA

     それで、クエリは実行されたので
     客先も大丈夫だろうと思い
     このクエリを客先へ送信しました。
     そして、客先側で実行して頂いたのですが

     上記と同様なメッセージが出ました。
     それで、制約削除のメッセージを外して、実行したら
     'DF__テーブル名__項目名__****' は制約ではありません。

     「52AF0DCA」ではなくて「****」(すいません英数字が記載されていたのですが覚えていません)
     と違う英数字が記載されていました。

     それで、次の一文を追加し
     ALTER TABLE TR_受注 DROP CONSTRAINT DF__テーブル名__項目名__****
     実行したら、成功しました。

     この英数字は何を意味しているのですか?
     これは、異なるコンピュータで違うのですか?

     もしそうならば、客先で変更について検討しなくてはいけません。
     誠にお手数ですがご回答お願い致します。

     以上

    2011年8月5日 7:26

回答

  • たとえば、テーブルを作成する際に、

    CREATE TABLE table1
    
    (
    
     Col1 INTEGER PRIMARY KEY,
    
     Col2 INTEGER UNIQUE
    
    );
    
    
    
    

    などと、プライマリキーやユニークキーを名前を指定しないで作成した場合、自動的に作成される制約には SQL を実行した場所や時刻を元にしているであろうランダムな英数字が付与されたものが作成されます。(キーにかぎらず、制約の名前を省略すると発生します)

    このため、こういった制約を後から変更するのは、ちょっと面倒になります。変更を想定して、テーブルを生成する時からきちんとすべての制約に名前をつけていれば、付けた名前で制約を操作できて保守が簡単になります。

    CREATE TABLE Table1
    (
      Col1 INTEGER CONSTRAINT PK_Table1 PRIMARY KEY,
      Col2 INTEGER CONSTRAINT UX_Table1_Col2 UNIQUE
    );

    こんなかんじであれば、ALTER TABLE 等で指定するときに、どこで実行しても PK_Table1 や UX_Table1_Col2 といった指定した名前で操作することができます。

    • 回答の候補に設定 山本春海 2011年8月16日 7:09
    • 回答としてマーク 山本春海 2011年8月25日 2:53
    2011年8月5日 8:11
  • データベースを設計した人に「DF__テーブル名__項目名__****」とは何なのか、なぜ環境ごとに違う名前なのか、削除しても問題なのか、を確認してください。

    # なんとなくわかる気もするけど…正確なところはやっぱりわからないので。

    • 回答の候補に設定 山本春海 2011年8月16日 7:09
    • 回答としてマーク 山本春海 2011年8月25日 2:53
    2011年8月5日 8:13
  • デフォルト制約が暗黙的に作成されたのではないかと。

    DF__テーブル名__項目名__**** の "****" は、ユニークな値になり、マシンによって異なると思います。

    • 回答の候補に設定 山本春海 2011年8月16日 7:09
    • 回答としてマーク 山本春海 2011年8月25日 2:53
    2011年8月9日 10:51
  • SQL Server でDefault制約をつけるときに
    ALTER TABLE [dbo].[TestTable] ADD DEFAULT ((0)) FOR [Column1]
    

    のようにした場合、

    DF__[テーブル名]__[カラム名]__[ユニークな文字列]

    の制約名が自動的にできます。
    当然、導入先毎で制約名は変わります。

    これを避けるために

    ALTER TABLE [dbo].[TestTable] ADD CONSTRAINT [DF_TestTable_Column1] DEFAULT ((0)) FOR [Column1]
    

    のように記述すべきだろうと思います。

    また、客先保守担当者であろう質問者さんが
    Default制約が存在することをご存じないことがかなり問題に思えます。

    制約を削除した後、質問文にある ALTER TABLE のクエリのみで更新してしまった場合
    制約が前提となっているであろうアプリケーションに問題が起きる可能性が大です。
    下手すると始末書になっちゃいます(怖い)。

    それで佐祐理さんが
    「データベースを設計した人に確認してください」とコメントされたのだろうと思います。

    カラムの定義を変える場合は、データベース設計をきちんと確認する必要があると思います。

    # 環境が書かれていないのでSQL Server2008R2SP1前提です。
    • 回答の候補に設定 山本春海 2011年8月16日 7:09
    • 回答としてマーク 山本春海 2011年8月25日 2:53
    2011年8月11日 23:42

すべての返信

  • たとえば、テーブルを作成する際に、

    CREATE TABLE table1
    
    (
    
     Col1 INTEGER PRIMARY KEY,
    
     Col2 INTEGER UNIQUE
    
    );
    
    
    
    

    などと、プライマリキーやユニークキーを名前を指定しないで作成した場合、自動的に作成される制約には SQL を実行した場所や時刻を元にしているであろうランダムな英数字が付与されたものが作成されます。(キーにかぎらず、制約の名前を省略すると発生します)

    このため、こういった制約を後から変更するのは、ちょっと面倒になります。変更を想定して、テーブルを生成する時からきちんとすべての制約に名前をつけていれば、付けた名前で制約を操作できて保守が簡単になります。

    CREATE TABLE Table1
    (
      Col1 INTEGER CONSTRAINT PK_Table1 PRIMARY KEY,
      Col2 INTEGER CONSTRAINT UX_Table1_Col2 UNIQUE
    );

    こんなかんじであれば、ALTER TABLE 等で指定するときに、どこで実行しても PK_Table1 や UX_Table1_Col2 といった指定した名前で操作することができます。

    • 回答の候補に設定 山本春海 2011年8月16日 7:09
    • 回答としてマーク 山本春海 2011年8月25日 2:53
    2011年8月5日 8:11
  • データベースを設計した人に「DF__テーブル名__項目名__****」とは何なのか、なぜ環境ごとに違う名前なのか、削除しても問題なのか、を確認してください。

    # なんとなくわかる気もするけど…正確なところはやっぱりわからないので。

    • 回答の候補に設定 山本春海 2011年8月16日 7:09
    • 回答としてマーク 山本春海 2011年8月25日 2:53
    2011年8月5日 8:13
  • デフォルト制約が暗黙的に作成されたのではないかと。

    DF__テーブル名__項目名__**** の "****" は、ユニークな値になり、マシンによって異なると思います。

    • 回答の候補に設定 山本春海 2011年8月16日 7:09
    • 回答としてマーク 山本春海 2011年8月25日 2:53
    2011年8月9日 10:51
  • ええ、それを含んで「なんとなくわかる気もするけど」と書きました。
    ユーザーごとにあえて制約名を変えることを望んでいるのか、それとも知らずに結果的にそうなっているのか。後者だろうと予想はされますが、断定はできませんので。
    2011年8月10日 0:54
  • SQL Server でDefault制約をつけるときに
    ALTER TABLE [dbo].[TestTable] ADD DEFAULT ((0)) FOR [Column1]
    

    のようにした場合、

    DF__[テーブル名]__[カラム名]__[ユニークな文字列]

    の制約名が自動的にできます。
    当然、導入先毎で制約名は変わります。

    これを避けるために

    ALTER TABLE [dbo].[TestTable] ADD CONSTRAINT [DF_TestTable_Column1] DEFAULT ((0)) FOR [Column1]
    

    のように記述すべきだろうと思います。

    また、客先保守担当者であろう質問者さんが
    Default制約が存在することをご存じないことがかなり問題に思えます。

    制約を削除した後、質問文にある ALTER TABLE のクエリのみで更新してしまった場合
    制約が前提となっているであろうアプリケーションに問題が起きる可能性が大です。
    下手すると始末書になっちゃいます(怖い)。

    それで佐祐理さんが
    「データベースを設計した人に確認してください」とコメントされたのだろうと思います。

    カラムの定義を変える場合は、データベース設計をきちんと確認する必要があると思います。

    # 環境が書かれていないのでSQL Server2008R2SP1前提です。
    • 回答の候補に設定 山本春海 2011年8月16日 7:09
    • 回答としてマーク 山本春海 2011年8月25日 2:53
    2011年8月11日 23:42
  • こんにちは、zeak01 さん。

    MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。

    みなさんから、有効な情報をいただいているかと思われましたので、他の方にもこの情報を有効活用していただくよう、勝手ながら私のほうで回答としてマークさせていただきました。
    回答くださった皆さん、情報ありがとうございます。

    いただいた情報の中で、解決に役立った投稿や、参考になる情報など有効な情報には回答としてマークすることをお願いしています。
    今後、同じ問題でこのスレッドを参照される方にも、有効な情報がわかりやすくなるかと思いますので、ご協力よろしくお願いいたしますね。
    今後とも、MSDN フォーラムをよろしくお願いいたします。
                                                                 
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2011年8月25日 2:53