在SPL程序即将开始执行时,需要确定哪个用户将与此过程相关联。此用户称为当前用户。使用当前用户的数据库对象特权来确定是否允许访问程序中引用的数据库对象。将使用调用程序时生效的当前常用搜索路径来解析任何非限定对象引用。

当前用户的选择受 SPL 程序是使用定义者的权限还是调用者的权限创建的影响。AUTHID 子句确定该选择。出现的 AUTHID DEFINER 子句提供程序定义者的权限。这也是省略 AUTHID 子句时的默认值。使用子句 AUTHID CURRENT_USER 提供程序调用者的权限。两者的区别总结如下:

  • 如果程序具有定义者的权限,则在程序执行开始时,程序的所有者将成为当前用户。使用程序所有者的数据库对象特权来确定是否允许访问引用的对象。在定义者的权限程序中,与实际调用程序的用户无关。
  • 如果程序具有调用者的权限,则调用程序时的当前用户在程序执行时保留为当前用户(但在调用的子程序中不一定如此 – 请参阅以下要点)。在调用了调用者的权限程序时,当前用户通常是启动会话(即,建立数据库连接)的用户,不过在会话启动后可以使用 SET ROLE 命令更改当前用户。在调用者的权限程序中,与实际拥有程序的用户无关。

通过以前的定义,可以获得以下观察结果:

  • 如果定义者的权限程序调用定义者的权限程序,则在被调用程序的执行期间,当前用户将从调用程序的所有者变为被调用程序的所有者。
  • 如果定义者的权限程序调用了调用者的权限程序,则在调用程序和被调用程序的执行期间,调用程序的所有者保留为当前用户。
  • 如果调用者的权限程序调用了调用者的权限程序,则在被调用程序的执行期间,调用程序的当前用户保留为当前用户。
  • 如果调用者的权限程序调用定义者的权限程序,则在被调用程序的执行期间,当前用户切换为定义者的权限程序的所有者。

如果在上面引用的情况下被调用程序又调用另一个程序,则适用相同原则。