SQL、他の依存関係を破らずにSQLテーブルの列を変更する方法は?
-
28-09-2019 - |
質問
これは非常に一般的なクエリかもしれませんが、今のところ良い答えを見つけることができませんでした。
これが私の質問です:
名前のテーブルがあります 連絡先 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つずつ機能します。このような変更のための他の良い選択肢はありません。