裏話
プライマリテーブルの1つでNaturalKey列を廃止することを計画している職場で。プロジェクトは、このテーブル/列にリンクする100以上のアプリケーションで構成されています。この列を直接参照する400以上のストアドプロシージャ。また、この列を参照する、これらのアプリケーション間の膨大な数の共通テーブル。
BigBangとStartfromScratchの方法は理解できません。このコラムを一度に1つのアプリケーションで非推奨にし、変更を認証して、次の列に進みます...そして、この取り組みを実用化するための長い目標があります。
私が抱えている問題は、これらのアプリケーションの多くがストアドプロシージャとテーブルを共有していることです。アプリケーションAのすべてのテーブル/ストアドプロシージャを完全に変換すると、アプリケーションBとCは変換されるまで壊れます。これらは順番にアプリケーションD、E、F...Etcを壊す可能性があります。私はすでにコードクラスとストアドプロシージャのために実装された戦略を持っています、私が立ち往生している部分はデータベースの遷移状態です。
これが私たちが持っているものの基本的な例です:
Users
---------------------------
Code varchar(32) natural key
Access
---------------------------
UserCode varchar(32) foreign key
AccessLevel int
そして、私たちは今、このような移行状態を目指しています:
Users
---------------------------
Code varchar(32)
Id int surrogate key
Access
---------------------------
UserCode varchar(32)
UserID int foreign key
AccessLevel int
移行フェーズでは、移行されていないアプリケーションとストアドプロシージャは引き続きすべての適切なデータにアクセスでき、新しいデータは正しい列にプッシュを開始できます。すべてのストアドプロシージャとアプリケーションの移行が完了すると、最終的に余分な列を削除します。
SQL Serverのトリガーを使用して、新しい挿入/更新を自動的にインターセプトし、影響を受ける各テーブルに対して次のようなことを実行したいと思いました。
CREATE TRIGGER tr_Access_Sync
ON Access
INSTEAD OF INSERT(, UPDATE)
AS
BEGIN
DIM @code as Varchar(32)
DIM @id as int
SET @code = (SELECT inserted.code FROM inserted)
SET @id = (SELECT inserted.code FROM inserted)
-- This is a migrated application; find the appropriate legacy key
IF @code IS NULL AND @id IS NOT NULL
SELECT Code FROM Users WHERE Users.id = @id
-- This is a legacy application; find the appropriate surrogate key
IF @id IS NULL AND @code IS NOT NULL
SELECT Code FROM Users WHERE Users.id = @id
-- Impossible code:
UPDATE inserted SET inserted.code=@code, inserted.id=@id
END
質問
私がこれまでに抱えている2つの大きな問題は次のとおりです。
- NULL制約により挿入が失敗するため、「AFTERINSERT」を実行できません。
- 私が言及した「不可能なコード」は、元のクエリをきれいにプロキシしたい方法です。元のクエリにx、y、z列が含まれている場合、またはxだけの場合、理想的には同じトリガーでこれらを実行します。また、別の列を追加/削除する場合は、トリガーを機能させたままにします。
これが可能なコード例、または値の1つだけがSQLに渡された場合でもこれらの列を適切に入力し続けるための代替ソリューションさえありますか?