【问题标题】:Oracle PL SQL, dynamic synonym feasible (parameterizing schema/table names)?Oracle PL SQL,动态同义词可行(参数化模式/表名)?
【发布时间】:2016-01-26 22:47:35
【问题描述】:

是否可以使用动态同义词参数化存储过程中查询中使用的模式和表名?

我们尝试过的是

  1. 在名称/值对表中设置参数
  2. 在运行时读取这些参数以确定架构(和表名),因为目标会根据 应用
  3. 删除任何现有的同义词并重新创建架构和表
  4. 在查询中引用同义词

我们尝试这种方法的原因是因为要执行的查询是数百行长的合并语句,不适合动态 SQL。

【问题讨论】:

  • 这是一个棘手的问题。如果删除同义词,所有使用同义词的存储过程都将失效。如果您还没有在当前会话中使用该过程,那应该不是问题。下次访问时会重新编译。如果您已经使用过它,您将遇到错误消息。因此,如果您采取额外的预防措施并妥善管理您的会话,这可能是可行的。
  • 动态 SQL 没有理由只有简短的语句,您甚至可以使用 CLOB 来表示 EXECUTE IMMEDIATE。使用DBMS_SQL.VARCHAR2A,编写大型 SQL 语句非常简单。
  • 可以,但就易于维护而言,这不是最佳解决方案。如果您动态创建语句并使用 oracle 内置插件,那么至少所有代码都在一个地方。通过创建同义词,这可能会导致名称冲突、安全性问题以及一个错误的不幸副作用会导致错误的内容被更改

标签: oracle stored-procedures dynamic plsql synonym


【解决方案1】:

当您为您的程序使用调用者权限时,也许您可​​以解决您的问题。看看这个例子:

CREATE USER SCOTT_1 IDENTIFIED BY "tiger";
GRANT UNLIMITED TABLESPACE TO SCOTT_1;

CREATE USER SCOTT_2 IDENTIFIED BY "tiger";
GRANT UNLIMITED TABLESPACE TO SCOTT_2;

CREATE TABLE SCOTT_1.EMP (EMP_NAME VARCHAR2(30));
CREATE TABLE SCOTT_2.EMP (EMP_NAME VARCHAR2(30));

INSERT INTO SCOTT_1.EMP VALUES ('Schema 1');
INSERT INTO SCOTT_2.EMP VALUES ('Schema 2');
COMMIT;

CREATE SYNONYM EMP FOR SCOTT_1.EMP; -- Just needed to compile the procedure

CREATE OR REPLACE FUNCTION GetSchema(p_schema IN VARCHAR2) RETURN VARCHAR2 
   AUTHID CURRENT_USER 
AS
    res VARCHAR2(30);
BEGIN
    EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = ' || p_schema;
    SELECT EMP_NAME
    INTO res
    FROM EMP;

    -- Just switch back to own schema to avoid unexpected behaviors
    EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = '||USER;

    RETURN res;
END;
/


SELECT GetSchema('SCOTT_1') FROM dual;

GETSCHEMA('SCOTT_1') 
---------------------------------
Schema 1

1 row selected.


SELECT GetSchema('SCOTT_2') FROM dual;

GETSCHEMA('SCOTT_2')          
---------------------------------
Schema 2

1 row selected.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 2013-08-16
    • 2021-05-06
    • 1970-01-01
    • 2013-10-07
    • 2017-03-17
    • 2021-05-09
    相关资源
    最近更新 更多