Radim Marek:《深入了解PostgREST》——请假管理器(第二部分)
内容提要
本文是《深入了解PostgREST》系列的第二部分,介绍了使用API暴露和查询任何表的基本功能,通过设置db-schema和给予db-anon-role权限实现。还介绍了使用专用模式扩展API的好处,并提供了创建模式、设置权限和创建视图的示例。文章还介绍了使用存储过程和触发器实现数据修改和业务逻辑。最后,提到了实现简单工作流管理系统的步骤,并展示了通过PostgREST将其作为API暴露出来。
延伸解读
专用API模式:抽象与权限管理的优势
文章强调使用专用模式(如api)而非public模式来暴露API,这提供了更好的抽象层,隔离了核心数据模型与API接口。通过设置默认权限,可以批量授予匿名角色对新建对象的SELECT和EXECUTE权限,简化了权限管理。此外,视图可以组合多表数据、过滤软删除记录,减少客户端复杂查询,同时为未来重构数据模型提供灵活性。
存储过程与SECURITY DEFINER:业务逻辑封装的关键
文章通过api.add_user等函数示例,展示了如何用存储过程封装业务逻辑,如验证邮箱唯一性、强制manager_id非空。关键点是SECURITY DEFINER属性:由于匿名角色在public模式无权限,函数需以定义者权限执行,否则会报权限错误。这与视图默认的security_invoker行为相反,使用时需注意。函数通过/rpc/前缀调用,POST方法可修改数据,而GET方法强制只读事务,防止意外修改。
触发器实现自动业务规则:以请假审批为例
文章在实现请假审批流程时,选择用触发器在请求状态变为'approved'时自动插入负数的请假交易记录,从而扣减假期余额。触发器与函数的选择取决于场景:函数适合复杂且可复用的逻辑,触发器则更适合自动强制业务规则和保证数据库层面的一致性。示例中,触发器仅在状态从'pending'变为'approved'时触发,确保余额扣减的准确性和自动化。
Q&A
如何通过PostgREST暴露和查询数据库表?
通过设置db-schema和给予db-anon-role权限,可以暴露和查询任何表。
使用专用模式扩展API有什么好处?
使用专用模式可以提供更好的抽象和数据定制,帮助简化权限管理。
如何实现员工请假请求的工作流管理系统?
通过创建请假请求表和相关的存储过程,可以实现员工请假请求和审批流程。
在PostgREST中如何使用存储过程和触发器?
存储过程用于实现数据修改和业务逻辑,触发器可以在特定条件下自动执行操作。
如何创建用于请假请求的视图?
可以通过SQL语句创建视图,选择需要的字段并设置条件来展示请假请求。
PostgREST如何处理权限管理?
通过设置db-anon-role和专用模式,可以简化权限管理,批量授予权限。