1

is-relation によって E/R に接続された 2 つのテーブルがあります。「マザーテーブル」を代表する一枚

CREATE TABLE PERSONS(
      id                SERIAL NOT NULL,
      name              character varying NOT NULL,
      address           character varying NOT NULL,
      day_of_creation   timestamp NOT NULL DEFAULT current_timestamp,
      PRIMARY KEY (id)
)

「子テーブル」を表すもう一方

CREATE TABLE EMPLOYEES (
      id               integer NOT NULL,
      store            character varying NOT NULL,
      paychecksize     integer NOT NULL,
      FOREIGN KEY (id)
              REFERENCES PERSONS(id),
      PRIMARY KEY (id)
)

これらの 2 つのテーブルが 1 つのビューに結合されるようになりました

CREATE VIEW EMPLOYEES_VIEW AS
    SELECT 
       P.id,name,address,store,paychecksize,day_of_creation
    FROM 
       PERSONS AS P
    JOIN
       EMPLOYEES AS E ON P.id = E.id

db ユーザーがそのビューに挿入できるようにするルールまたはトリガーを作成し、分割された列の厄介な詳細を別のテーブルに保存したいと考えています。

day_of_creationしかし、IDはSERIALであり、ユーザーがそれらを提供する必要がないデフォルト値があるため、便利にしたいので、次のようなステートメント

INSERT INTO EMPLOYEES_VIEW (name, address, store, paychecksize)
VALUES ("bob", "top secret", "drugstore", 42)

結果として十分なはずです

id|name|address   |day_of_creation
-------------------------------
1 |bob |top secret| 2013-08-13 15:32:42

従業員

id|   store |paychecksize
---------------------
1 |drugstore|42

基本的なルールは次のように簡単です

CREATE RULE EMPLOYEE_VIEW_INSERT AS ON INSERT TO EMPLOYEE_VIEW
DO INSTED (
    INSERT INTO PERSONS
    VALUES (NEW.id,NEW.name,NEW.address,NEW.day_of_creation),
    INSERT INTO EMPLOYEES
    VALUES (NEW.id,NEW.store,NEW.paychecksize)
)

十分なはずです。しかし、実際には必要ないにもかかわらず、ユーザーが ID とタイムスタンプを提供する必要があるため、これは便利ではありません。

利便性の基準に一致するように、そのコード ベースを書き直して拡張するにはどうすればよいですか?

4

1 に答える 1

1

何かのようなもの:

CREATE RULE EMPLOYEE_VIEW_INSERT AS ON INSERT TO EMPLOYEES_VIEW
DO INSTEAD 
(
    INSERT INTO PERSONS (id, name, address, day_of_creation)
    VALUES (default,NEW.name,NEW.address,default);
    INSERT INTO EMPLOYEES (id, store, paychecksize)
    VALUES (currval('persons_id_seq'),NEW.store,NEW.paychecksize)
);

そうすれば、persons.idpersons.day_of_creationのデフォルト値がデフォルト値になります。別のオプションは、挿入からこれらの列を単純に削除することでした。

INSERT INTO PERSONS (name, address)
VALUES (NEW.name,NEW.address);

ルールが定義されると、次の挿入が機能するはずです。

insert into employees_view (name, address, store, paychecksize)
values ('Arthur Dent', 'Some Street', 'Some Store', 42);

ところで: 現在の Postgres バージョンでは、instead ofトリガーはビューを更新可能にするための推奨される方法です。

于 2013-08-13T14:08:39.733 に答える