当准备执行一个SPL程序的时候,首先会确定与这个进程相关联的用户。与进程相关联的用户变成当前用户(current user)。当前用户的搜索路径将会用来解析对于未限定的对象引用。当前用户的数据库对象权限用于确定是否允许在程序中对相关数据库对象进行引用。

SPL程序是否以定义者权限或调用者权限的方式创建影响对于当前用户的选择。AUTHID子句用于确定了这种选择。而AUTHID DEFINER子句给予了程序定义者权限。在缺省情况下,省略AUTHID子句。AUTHID CURRENT_USER子句给予了程序调用者的权限。这两种权限之间的不同点总结如下。
  • 如果一个程序有定义者权限,那么在程序开始执行的时候,程序所有者变成了当前用户。对于未限定对象引用的解析由程序所有者的搜索路径来完成,并且程序所有者所拥有数据对象的权限可用来确认是否允许对所引用的对象的访问。在一个定义者权限的程序中,它与哪个用户实际调用这个程序无关。
  • 如果一个程序有调用者权限,那么当前调用程序的用户,在执行程序的同时(但在被调用的子程序中不是必须的,参见下面的要点)仍然保持当前用户的身份。当调用带有调用者权限程序时,尽管在会话使用SET ROLE命令可能会改变用户身份,当前用户通常还是开始这个会话的用户(例如,产生数据库连接 )。在调用者权限程序中,这与实际拥有程序的用户无关。
从前面的定义中,可产生下列的事实:
  • 如果一个定义者权限程序调用定义者权限程序,那么当前用户在被调用程序的执行期间就由调用程序的所有者变为了被调用程序的所有者。
  • 如果一个定义者权限程序调用一个带有调用者权限的程序,那么调用程序的所有者在调用程序和被调用程序执行期间保持当前用户的身份。
  • 如果一个调用者权限程序调用一个调用者权限程序,那么当前用户在被调用程序的执行期间,调用程序的所有者保持当前用户的身份。
  • 如果一个调用者权限程序调用一个定义者程序,那么在被调用程序执行期间当前用户转换为定义者程序的所有者。

当被调用程序以上面所描述的情况轮流调用另外一个程序时,上面的原则也适用。