テーブル内の 1 つのフィールドが更新され、別のフィールドのデータがそのフィールドに依存している場合はどうなりますか?
名、ミドルネーム、姓、フルネームのフィールドがあります。Full_name 列は、「最後、最初、中間」のデータに対して 1 回挿入されます。
ミドル ネームを削除した場合、full_name フィールドを更新してそこからもミドル ネームを削除するにはどうすればよいですか?
ありがとう。本の推薦を歓迎します。
バージョン11.1より前のバージョンでは、Oracleは計算列をサポートしていませんが、AFTER UPDATE TRIGGER
代わりに次のものを使用できます。
CREATE OR REPLACE TRIGGER PERSON_MIDDLE_NAME_COMPUTE
AFTER UPDATE ON PERSON
FOR EACH ROW
BEGIN
SELECT (:NEW.LAST || ',' || :NEW.FIRST || NVL2(:NEW.MIDDLE, ',' || :NEW.MIDDLE, ''))
INTO :NEW.FULL_NAME
FROM DUAL;
END;
テーブルの 1 つの列が他の列のデータに依存することは、基本的な正規化に違反します。トリガーを使用してデータの同期を維持することは可能ですが、一般的にはかなり面倒です。あなたは一般的にはるかに優れています
full_name
テーブルから列を完全に削除します。を計算する関数を作成しfull_name
、完全な名前を生成するときにアプリケーションからその関数を呼び出すか、アプリケーションがデータのクエリに使用するビューに関数呼び出しを追加します。完全な名前で検索する必要がある場合は、この関数の結果に対して関数ベースのインデックスを作成できます。full_name
を定義できます。仮想列のアプローチは次のようになります
SQL> ed
Wrote file afiedt.buf
1 create table foo (
2 first_name varchar2(100),
3 last_name varchar2(100),
4 middle_name varchar2(100),
5 full_name varchar2(304) generated always as (last_name || ', ' ||
6 first_name ||
7 (case when middle_name is not null
8 then ', ' || middle_name
9 else null
10* end)) virtual )
SQL> /
Table created.
SQL> insert into foo(first_name, last_name, middle_name)
2 values( 'Justin', 'Cave', 'O.J.' );
1 row created.
SQL> select full_name from foo;
FULL_NAME
--------------------------------------------------------------------------------
Cave, Justin, O.J.
ここで実行したいのは、トリガーを作成することです。
トリガーが機能する方法は次のとおりです。
データベースは何かが変更されたことに気づき、その状況であなたが要求したことを実行します。