创建过程或函数时,可指定是希望过程或函数使用其所有者的特权进行运行,还是使用调用它的人员或过程(调用者)的特权进行运行。调用者的标识并不总是很明显。当用户可调用一个过程时,该过程可调用另一个过程。这种情况下,需要区分已登录用户(对顶级过程进行初始调用的用户)和有效用户(可能是初始过程所调用的过程的所有者)。当一个过程使用调用者特权进行运行时,将强制执行有效用户的特权。
如果创建一个过程或函数,则 CREATE PROCEDURE 语句或 CREATE FUNCTION 语句的 SQL SECURITY 子句将设置执行该过程或函数时所应用的特权,以及非限定对象的所有权。此子句的选择是 INVOKER 或 DEFINER。但是,一个用户可创建由另一个用户所拥有的过程或函数。在这种情况下,所应用的特权实际上是所有者而非定义者的特权。
在创建过程或函数时,应注意用适合的所有者限定所有对象名称(表、过程等)。如果过程中的对象的所有权未受限定,则所有权将根据其是以所有者还是调用者的身份进行运行而有所不同。例如,假定 user1 创建了以下过程:
CREATE PROCEDURE user1.myProcedure()
RESULT( columnA INT )
SQL SECURITY INVOKER
BEGIN
SELECT columnA FROM table1;
END; |
如果另一个用户 user2 试图运行此过程,而表 user2.table1 不存在,则会返回错误。如果 user2.table1 存在,则使用该表,而不使用 user1.table1。
当过程或函数使用调用者的特权进行运行时,调用者必须拥有过程的 EXECUTE 特权,以及过程、函数或系统过程运行时所在的数据库对象所需的特权。
如果您不确定任何过程或函数是以调用者还是定义者的身份进行执行的,则可查看其 SQL 定义中的 SQL SECURITY 子句。
要确定在执行用于对数据库进行特许操作的过程或函数时所需的特权,可使用 sp_proc_priv 系统过程。请参见sp_proc_priv 系统过程。
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2013, SAP 股份公司或其关联公司. - SAP Sybase SQL Anywhere 16.0 |