5

これはかなり一般的なクエリかもしれませんが、今のところ良い答えを見つけることができませんでした。

これが私の質問です:

varchar列Titleを持つContactsという名前のテーブルがあります。開発の途中で、フィールドTitleContactTitlesテーブルの外部キーであるTitleIDに置き換えたいと思います。現在、テーブルContactsには60を超える依存関係があります(他のテーブル、ビュー関数)。

どうすればそれを最も安全で簡単な方法で行うことができますか?

使用するもの:MSSQL 2005、データはすでに移行されています。スキーマを変更したいだけです。

編集:

迅速な再生をしてくれたAllに感謝します。

前述のように、連絡先テーブルには60を超える依存関係がありますが、次のクエリを実行すると、そのうち5つだけがタイトル列を使用します。移行スクリプトが実行されたため、データを変更する必要はありません。

/*gets all objects which use specified column */

SELECT Name FROM syscomments sc JOIN sysobjects so ON sc.id = so.id WHERE TEXT LIKE '%Title%' AND TEXT LIKE '%TitleID%'

次に、これらの5つのビューを確認し、手動で更新しました。

4

4 に答える 4

3

リファクタリング方法を使用します。と呼ばれる新しいフィールドを作成することから始めTitleID、次にすべてのタイトルをContactTitlesテーブルにコピーします。次に、TitleIDフィールドを使用するように、各依存関係を1つずつ更新します。各ステップの後で、システムがまだ機能していることを確認してください。

データが変更される場合は、注意して、Title列を変更するとContactTitlesテーブルも変更されることを確認する必要があります。リファクタリングを実行している間だけ、それらの同期を維持する必要があります。

編集:それについての本さえあります!データベースのリファクタリング

于 2010-06-21T11:18:06.830 に答える
2

他の人が指摘したように、RDBMS に依存します。

次の 2 つの方法があります。

  • テーブルに変更を加え、すべての依存関係を修正します
  • テーブルへの直接アクセスの代わりに使用できるビューを作成します (これにより、基になるコア テーブルの将来の変更を防ぐことができますが、DBMS によっては、一部の更新機能が失われる可能性があります)。
于 2010-06-21T11:29:55.593 に答える
1

Microsoft SQL Server Redgate には、このリファクタリングに役立つ (無料ではない) 製品があります http://www.red-gate.com/products/sql_refactor/index.htm

過去に、レビューするもののリストを取得するだけで、これを非常に簡単に(原始的ではあるが)行うことができました

SELECT * FROM sys.objects
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%Contacts%' 

(そして、おそらく依存関係情報を考慮して、オブジェクトの種類でフィルタリングします)

Management Studio で関心のあるすべてのものをスクリプト化してから、リストを下に移動してすべてを確認し、CREATE を ALTER に変更します。60 の可能な依存関係に対しても、非常に単純で反復的な変更である必要があります。さらに、存在しない列を参照している場合は、スクリプトを実行して ALTER を実行すると、エラー メッセージが表示されます。

クエリで使用*したり、アプリケーションでアドホック SQL を使用したりすると、明らかに事態が少し難しくなる可能性があります。

于 2010-06-21T11:48:36.250 に答える
0

SP_Depend'テーブル名'を使用してテーブルの依存関係を確認してから、SP_Renameを使用して列名の名前を変更します。これは非常に便利です。sp_renameは、PRIMARY KEYまたはUNIQUE制約の名前が変更されるたびに、関連付けられたインデックスの名前を自動的に変更します。名前が変更されたインデックスがPRIMARYKEY制約に関連付けられている場合、PRIMARYKEY制約もsp_renameによって自動的に名前が変更されます。

次に、プロシージャと関数を1つずつ更新し始めます。見つかった場合は、このような変更を行うための適切なオプションは他にありません。

于 2010-06-21T11:39:32.373 に答える