【问题标题】:Create Statement in a Trigger Oracle 11在触发器 Oracle 11 中创建语句
【发布时间】:2015-02-03 21:10:44
【问题描述】:

对于 Oracle 11g 和 RDMBS 来说还是很新的(一般而言)

我想添加一个触发器,它会在将行插入到表中时创建一个用户。

我遇到了默认错误,说我不能在触发器的主体中放置 create 语句 (PLS-00103)。我尝试了线在体内的不同位置,并在触发器中完全隔离了线,但错误总是发生在“CREATE”位置。有谁知道这是否是对触发器/存储过程的限制?如果是这样,这种限制的解决方法是什么?

我可以想象有一个触发器会创建一些东西对数据库来说是非常危险的,但我没有足够的经验来确定。

编辑添加此类触发器的原因

之所以要添加这样的触发器是因为

首先,我要初始化一个员工表。

其次,在表中没有员工的情况下,每个添加的员工将 (1) 创建一个用户名并传递给他们使用,以及 (2) 为他们提供一个员工角色的权限

编辑添加的代码

CREATE VIEW EMPLOYEES_VIEW AS
SELECT * FROM EMPLOYEES_TABLE;

CREATE TRIGGER NEW_EMPLOYEE_ROLE
INSTEAD OF INSERT
ON EMPLOYEES_VIEW
DECLARE INSERTED_EMPID CHAR;
BEGIN
    INSERTED_EMPID:= :NEW.EMPID;

    INSERT INTO EMPLOYEES_TABLE
    (EMPID, NAME, TAXID, COUNTRY, HIREDATE, BIRTHDATE, SALARY, BONUS, DEPTID, ADDRESS, ADDRESS_CITY, ADDRESS_ZIP, ADDRESS_COUNTRY)
    VALUES
    (:NEW.EMPID, :NEW.NAME, :NEW.TAXID, :NEW.COUNTRY, :NEW.HIREDATE, :NEW.BIRTHDATE, :NEW.SALARY, :NEW.BONUS, :NEW.DEPTID, :NEW.ADDRESS, :NEW.ADDRESS_CITY, :NEW.ADDRESS_ZIP, :NEW.ADDRESS_COUNTRY);

    CREATE USER INSERTED_EMPID IDENTIFIED BY INSERTED_EMPID;
    GRANT EMPLOYEE_ROLE TO INSERTED_EMPID;
END;
/

谢谢

【问题讨论】:

  • 您需要发布代码。但是我很困惑为什么要使用触发器来创建用户?在我看来这是一个奇怪的要求。
  • @IanCarpenter 我在上面进行了编辑。这是因为我希望创建一个员工表,其中每个添加的员工创建一个用户/通行证供员工登录,并为该登录提供特定的权限角色

标签: oracle triggers oracle11g


【解决方案1】:

您不能从任何 PL/SQL 上下文(包括触发器)运行任何 DDL,除非您使用动态 SQL;所以create ... 在 PL/SQL 块中作为静态 SQL 无效。

但是there are further restrictions on triggers。因为它们在 DML 语句中触发,所以您不能从一个语句中提交或回滚,而 DDL 会隐式提交。有可能解决这个问题,但这不是一个好主意。

假设您确实需要在插入行的同时创建用户,使用过程进行插入并动态创建用户会更简单,然后确保仅通过调用过程插入行。

create or replace procedure add_user(p_user_id varchar2, ...) as
begin
  insert into your_table ... ;
  execute immediate 'create user ' || p_user_id
    || ' identified by ...';
end;
/

您仍然需要注意即使创建失败,插入也会被隐式提交。在插入之前检查用户 ID 是一个有效的标识符是一个好主意,并且构成create 语句一部分的任何其他传递的参数也是有效的,以尽量减少这种风险。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 2013-12-24
    相关资源
    最近更新 更多