给定以下架构:

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应用程序开发人员,我习惯了这样一个环境,在这个环境中,这将签入应用程序代码,但我正在处理一个数据库,该数据库将由两个应用程序(Golang和Ruby)共享
我能在多态字段(REFERENCEStarget_type)上实现一个target_uuid吗?

最佳答案

我是否可以在插入行之前使用触发器、在插入行之前创建触发器检查授权或更新每行的邀请执行过程检查授权();
使其成为(after)约束触发器,并在适当时引发异常。
更一般地,在需要时使用before触发器修改传入数据,使用after触发器传播副作用,使用约束触发器验证完整性。
在一条错误消息中,我可以返回多少信息,以防仅仅因为数据库连接断开而失败,等等
当你提出你的例外时,你想发送多少就发送多少。
这是明智的做法吗?作为一个web应用程序开发人员,我习惯了这样一个环境,在这个环境中,这将签入应用程序代码,但我正在处理一个数据库,该数据库将由两个应用程序(Golang和Ruby)共享
如果做得对,这可能是明智的,但本质上不可能正确地管理在涉及授权时潜入的所有更奇怪的情况,因此这种逻辑通常更好地位于数据库之外。
举个例子:当经理的秘书替代者(原来的秘书正在休产假)这样做时会发生什么?
我能在多态字段(target_type,target_uuid)上以某种方式实现引用吗?
你可以,用后扳机。但是,根据您所做的,考虑使用单独的字段、外键和check约束来规范化它,以确保它们是互斥的。管理起来往往比最终手动重写外键逻辑更容易/更干净。

关于function - 通过数据库触发器邀请用户的授权,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19389972/

10-10 14:06
查看更多