Oracleに「列Symlink」のようなものはありますか?
-
26-10-2019 - |
質問
DBの列に2つの列名を介して一時的にアクセスできるようにしたいと思います。
なんで?列名がひどく選ばれたので、リファクタリングしたいと思います。列名を変更しながらWebAppを安定させたいので、それは良いでしょう
- (それを呼びましょう)symlinkという名前を持っています Better_column_name 列を指しています bad_column_name
- 使用するWebApplicationを変更します Better_column_name
- symlinkをドロップし、列を変更します Better_column_name
「リファクタリングデータベース」は、これを達成するためにコミットで同期される2番目の列を実際に追加することを示唆しています。私は、Oracleでより簡単な方法があり、仕事が少なく、頭上が少ないことを望んでいるだけです。
解決
両方の列名を使用するコードがある限り、そのテーブルに2つの(実際の)列があるという事実を回避する方法はありません。
正しい名前で新しい列を追加し、変更された列をチェックし、「他の」列をそれに対応して更新するトリガーを作成します。したがって、更新されているものが何であれ、値は他の列と同期されます。
古い列を使用するすべてのコードが移行されたら、トリガーを削除して古い列をドロップします。
編集
トリガーはこのようなことをするでしょう:
CREATE OR REPLACE TRIGGER ...
...
UPDATE OF bad_column_name, better_column_name ON the_table
...
BEGIN
IF UPDATING ('BAD_COLUMN_NAME') THEN
:new.better_column_name = :new.bad_column_name
END IF;
IF UPDATING ('BETTER_COLUMN_NAME') THEN
:new.bad_column_name = :new.better_column_name
END IF;
END;
の順序 IF
誰かが同時に両方の列を更新した場合、どの変更が「優先度が高い」と制御します。
他のヒント
テーブルの名前の名前:
alter table mytable rename to mytable_old;
bad_column_nameとbetter_column_nameの両方を使用して、元のTableNameを使用してビューを作成します そのポイントは同じ列です (そしてもちろん他のすべての列):
create or replace view mytable as
select column1
, column2
, ...
, bad_column_name
, bad_column_name better_column_name
from mytable_old
;
このビューはデフォルトで更新可能であるため(MyTableにはプライマリキーがあると仮定します)、ビューから挿入/更新/削除できますが、bad_column_nameまたはbetter_column_nameを使用するかどうかは関係ありません。
リファクタリングの後、ビューをドロップし、テーブルと列の名前を変更します。
drop view mytable;
alter table mytable_old rename column bad_column_name to better_column_name;
alter table mytable_old rename to mytable;
これに対する最良のソリューションは、Oracle 11gリリース2:Editionベースの再定義でのみ入手できます。この非常にクールな機能により、特別なトリガーとビューを使用して、データベーステーブルとPL/SQLコードのさまざまなバージョンを維持できます。 詳細をご覧ください.
本質的に、これはOracleの組み込みの実装です @ahorsewithnonameの提案.
テーブルのビューを作成できます。テーブルの代わりにそのビューを使用するようにアプリケーションを移植します。
create table t (bad_name varchar2(10), c2 varchar2(10));
create view vt as select bad_name AS good_name, c2 from t;
insert into vt (good_name, c2) values ('blub', 'blob');
select * from t;
select * from vt;
11gにいる場合は、仮想列の使用を検討できます。私はおそらく注文を少し変更したいと思うでしょう。実際の列の名前を変更し、古い(悪い)名前を使用して仮想の列を作成し、それをレジャーで落とすことができます。もちろん、あなたは制限されている可能性があり、この順序をあなたに適していない他のオブジェクトが無効になっていることに影響があるかもしれません。