質問

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

これが私の質問です:

名前のテーブルがあります 連絡先 varchar列付き タイトル. 。開発中にフィールドを交換したい タイトルTitleId これは外国の鍵です contactTitles テーブル。現時点でテーブル 連絡先 60を超える依存関係があります(他の表、ビュー関数)。

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

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

編集:

迅速なリプレイをありがとう。

言及されたように 連絡先 テーブルには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つのビューを経験し、手動で更新しました。

役に立ちましたか?

解決

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%' 

(そして、おそらく依存関係情報を考慮し、オブジェクトタイプごとにフィルタリングします)

マネジメントスタジオに関心のあるものすべてをスクリプト化し、リストを下ろしてすべてレビューし、作成を変更するために変更します。 60の可能性のある依存関係であっても、非常に単純で反復的な変更である必要があります。さらに、存在しない列を参照している場合は、スクリプトを実行して変更するときにエラーメッセージが表示されるはずです。

使用する場合 * アプリケーションのクエリまたはアドホックSQLでは、明らかに物事がもう少し難しいかもしれません。

他のヒント

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

データが変更されている場合は、注意して、 Title 列も変更します ContactTitles テーブル。リファクタリングを行っている間、それらを同期させるだけです。

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

他の人が指摘したように、それはあなたのrdbmsに依存します。

2つのアプローチがあります。

  • テーブルに変更を加えて、すべての依存関係を修正します
  • テーブルへの直接アクセスの代わりに使用できるビューを作成します(これにより、基礎となるコアテーブルの将来の変更を防ぐことができますが、DBMSに応じて、いくつかの更新機能を失う可能性があります)

sp_depend 'table name'を使用してテーブルの依存関係を確認し、sp_renameを使用して非常に便利な列名の名前を変更します。 SP_RENAMEは、プライマリキーまたは一意の制約が変更された場合はいつでも、関連するインデックスを自動的に変更します。変更されたインデックスが主要なキーの制約に関連付けられている場合、主要なキーの制約もSP_RENAMEによって自動的に名前が変更されます。

そして、手順と機能の更新を開始し、1つずつ機能します。このような変更のための他の良い選択肢はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top