本节书摘来自华章计算机《PostgreSQL服务器编程》一书中的第1章,第1.5节,作者:(美)Hannu Krosing, Jim Mlodgenski, Kirk Roybal 著,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1.5 审核更改
如果你需要知道谁对数据做了什么操作、是在什么时候进行的操作,一个简单的方法就是用日志来记录每个在重要的数据表上执行的动作。
这里至少有两种等效的方法可进行这种审核:
使用审核触发器
仅允许通过函数的方式来访问表,并且仅在函数内完成审核
接下来,我们将分别看一下每种方法的简单示例。
首先,我们创建这些表:
在一般情况下,并不希望用户可以更改审核日志,所以你只会把权限给到管理员,让他们可以访问这些表。而如果你计划让用户直接访问薪资表,为了达到审核的目的,你应该在这个表上放置一个触发器:
现在,让我们测试一下一些薪资管理:
为了达到审核的目的,每个更改都被保存到薪资变更日志表:
另一方面,你可能并不希望每个人都有直接访问薪资表的权限,在这种情况下,你可以执行以下语句:
同时,你给用户仅仅开放了两个函数的访问权限:一个是为了让任何用户可以查询薪资,另外一个是为了更改薪资,这个是只有管理员才可以操作的。
这些函数本身都有所有基础表的访问权限,因为它们被声明为安全定义者(SECURITY DEFINER),也就意味着它们执行的时候有创建者的权限。
薪资查看函数如下所示:
请注意,这里我们实现了一个“软件安全”(soft security)的方法,即你可以查看别人的薪资,但是你必须为这件事情负责,就是说,仅仅当你需要这样做时才有必要进行这样的操作,因为管理员将会知道你已经查看过别人的薪资。
set_salary()函数抽象出一个需求——检查用户是否存在,如果用户不存在,则创建用户。如果将用户的薪资设置为0,则会将用户从薪资表中删除。因此这个接口是被彻底简化的,这些函数的客户端应用程序需要知道的和完成的则会更少:
现在删除audit触发器(否则,更改会被日志记录两次),并测试新的功能: