sql - RESTRICT_REFERENCES 和触发器

标签 sql oracle plsql oracle11g

我将 PRAGMA RESTRICT_REFERENCES 添加到包中的过程(例如,RNPS)。该过程实现在表中插入一行。

该表有一个前插入触发器。该触发器从包中读取变量并将其放入:new.my_column。

我可以毫无问题地编译包体,即使它看起来实际上是从包变量中读取值。

当我执行该程序时,它确实有效。但这是开发环境,通常没有多个同时连接。我担心这可能会在生产环境中失败。

那么,我应该担心,还是这真的有效?

示例代码:

CREATE TABLE MY_TABLE 
(
  ID VARCHAR2(20) NOT NULL 
, USER_ID VARCHAR2(50) 
, CONSTRAINT MY_TABLE_PK PRIMARY KEY 
  (
    ID 
  )
  ENABLE 
);

CREATE OR REPLACE PACKAGE PUSER IS

    PROCEDURE saveUser(
            pUserId VARCHAR2
        );
    PRAGMA RESTRICT_REFERENCES (saveUser, WNDS, RNDS, RNPS);

    FUNCTION getUser RETURN VARCHAR2;
    PRAGMA RESTRICT_REFERENCES (getUser, WNDS, RNDS, WNPS);

END PUSER;

CREATE OR REPLACE PACKAGE BODY PUSER AS

    userId VARCHAR2(50);

    PROCEDURE saveUser(
            pUserId VARCHAR2
        ) IS
    BEGIN
        userId := pUserId;
    END saveUser;

    FUNCTION getUser RETURN VARCHAR2 IS
    BEGIN
        RETURN userId;
    END getUser;

END PUSER;


CREATE OR REPLACE PACKAGE MY_PACKAGE IS

    PROCEDURE insertMyTable(
            pId VARCHAR2
        );
    PRAGMA RESTRICT_REFERENCES (insertMyTable, RNPS);

END MY_PACKAGE;

CREATE OR REPLACE PACKAGE BODY MY_PACKAGE AS

    PROCEDURE insertMyTable(
            pId VARCHAR2
        ) IS
    BEGIN
        INSERT INTO MY_TABLE(id) VALUES(pId);
    END insertMyTable;
END MY_PACKAGE;

CREATE OR REPLACE TRIGGER MY_TABLE_TRIGGER
BEFORE INSERT ON MY_TABLE FOR EACH ROW
DECLARE
BEGIN
    :new.USER_ID := PUSER.getUser;
END MY_TABLE_TRIGGER;

编辑:我知道 RESTRICT_REFERENCES 已被弃用,但知道这对现有代码仍然有用。

最佳答案

RNPS仅对函数有用,因为它告诉编译器,如果同时没有包状态(或其他编译指示的数据库状态)发生更改,则函数的返回值在调用之间不会更改。它允许缓存,但比 RESULT_CACHE 更隐式或 DETERMINISTIC (这是现在告诉优化器期望什么的首选方式)。

因为你在一个过程中使用它,所以它并不重要。您可以在不更改包装规范的情况下安全地进行操作。但是,由于您(或您的继任者)可能会在一年后问自己同样的问题,因此您不妨在使用时立即更改软件包。

关于sql - RESTRICT_REFERENCES 和触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36313290/

相关文章:

SQL Azure 联合和原子单元标识

javascript - 为什么 Sequelize 不针对我的 MS Sql 数据库进行身份验证?

oracle - 使用 Oracle 12c 安装 Liferay 7 CE 时出错

oracle - 在过程中创建 oracle sql 游标错误

php - PHP 和 Oracle 可以相互传递复杂类型吗?

sql - Angularjs 写入 Azure SQL 表

mysql - 如何在mysql中执行以下连接?

java - 通过 Docker 在 Tomcat 上部署 .war - 404

sql - Oracle SQL Developer 查询结果导出向导默认输出文件名

sql - oracle中的<< some text>>是什么