1

次のスキーマがあるとします。

Table "public.users"
        Column        |           Type           |                         Modifiers
----------------------+--------------------------+------------------------------------------------------------
 uuid                 | uuid                     | not null default uuid_generate_v4()
 email                | character varying(254)   | not null
 name                 | text                     | not null
 created_at           | timestamp with time zone | not null default now()

Table "public.users_projects"
     Column      |           Type           |                 Modifiers
-----------------+--------------------------+--------------------------------------------
 project_uuid    | uuid                     | not null
 user_uuid       | uuid                     | not null
 invitation_uuid | uuid                     |
 membership_type | membership_type          | not null default 'member'::membership_type
 created_at      | timestamp with time zone | not null default now()

Table "public.projects"
   Column   |           Type           |              Modifiers
------------+--------------------------+-------------------------------------
 uuid       | uuid                     | not null default uuid_generate_v4()
 name       | character varying(100)   | not null
 created_at | timestamp with time zone | not null default now()

Table "public.invitations"
     Column      |           Type           |                 Modifiers
-----------------+--------------------------+--------------------------------------------
 uuid            | uuid                     | not null default uuid_generate_v4()
 email           | character varying(254)   | not null
 target_type     | character varying(50)    | not null
 target_uuid     | uuid                     | not null
 membership_type | membership_type          | not null default 'member'::membership_type
 token           | character varying(32)    | not null default md5((random())::text)
 creator_uuid    | uuid                     | not null

列挙型もありCREATE TYPE membership_type AS ENUM ('guest', 'member', 'manager', 'owner');ます。

managerトリガーを使用して、少なくとも結合テーブルにメンバーシップ タイプがなければ、ユーザーがリソースへの招待を作成できないことを確認できるかどうか疑問に思っています。

私の主な質問は次のとおりです。

  • 行が挿入される「前」にトリガーを使用できますか?CREATE TRIGGER check_authorisation BEFORE INSERT OR UPDATE ON invitations FOR EACH ROW EXECUTE PROCEDURE check_authorisation();
  • データベース接続がダウンしているなどの理由で単に失敗するのに対して、エラー メッセージでどれだけの情報を返すことができますか?
  • これは健全なアプローチですか?私は Web アプリケーション開発者として、これがアプリケーション コードでチェックされる環境に慣れていますが、2 つのアプリケーション (Golang と Ruby) で共有されるデータベースに取り組んでいます。
  • REFERENCESどうにかして多相フィールド ( target_type、 )に a を実装できますtarget_uuidか?
4

1 に答える 1

0

行が挿入される「前」にトリガーを使用できますか?

それを(後)制約トリガーにし、適切な場合に例外を発生させます。

より一般的には、必要に応じて受信データを変更するには before トリガーを使用し、副作用を伝播するには after トリガーを使用し、整合性を検証するには制約トリガーを使用します。

データベース接続がダウンしているなどの理由で単に失敗するのに対して、エラー メッセージでどれだけの情報を返すことができますか?

例外を発生させるときに送信したいだけ。

これは健全なアプローチですか?私は Web アプリケーション開発者として、これがアプリケーション コードでチェックされる環境に慣れていますが、2 つのアプリケーション (Golang と Ruby) で共有されるデータベースに取り組んでいます。

正しく行われれば正気かもしれませんが、承認に関して忍び寄る奇妙なケースをすべて適切に管理することは本質的に不可能であるため、このタイプのロジックは通常、データベースの外部に配置することをお勧めします。

適切な例: マネージャーの秘書の後任 (元の秘書は産休中) がこれを行うとどうなりますか?

ポリモーフィック フィールド (target_type、target_uuid) に REFERENCES を実装できますか?

after トリガーを使用すると、できます。ただし、実行している内容によっては、個別のフィールド、外部キー、およびチェック制約を使用してこれを正規化し、それらが相互に排他的であることを確認することを検討してください。多くの場合、最終的に外部キー ロジックを手動で書き直すよりも、管理が簡単でクリーンです。

于 2013-10-16T08:31:17.137 に答える