Database 在Oracle db触发器中设置递归级别

Database 在Oracle db触发器中设置递归级别,database,oracle,plsql,Database,Oracle,Plsql,我正在处理一个pl/sql用例,在这个用例中,我需要为“create”创建一个触发器,并在触发器内部再次创建一个表。是否有一种方法可以将递归级别设置为1,类似于Oracle db中的sql server。请建议 编辑: 添加触发器和createtable命令 CREATE TRIGGER abc AFTER CREATE ON DATABASE BEGIN IF TRIGGER_NESTLEVEL() <= 1 THEN EXECUTE IMMEDIATE 'CREATE TABLE d

我正在处理一个pl/sql用例,在这个用例中,我需要为“create”创建一个触发器,并在触发器内部再次创建一个表。是否有一种方法可以将递归级别设置为1,类似于Oracle db中的sql server。请建议


编辑:

添加触发器和createtable命令

CREATE TRIGGER abc
AFTER CREATE ON DATABASE
BEGIN
IF TRIGGER_NESTLEVEL() <= 1 THEN
EXECUTE IMMEDIATE
'CREATE TABLE dep (
             dep_id NUMBER(4) NOT NULL,
             dep_nm VARCHAR2(30),
             c_id NUMBER(4) NOT NULL)
       PARTITION BY HASH(dep_id)
       (PARTITION t1 tablespace tbs2)';
EXECUTE IMMEDIATE
'CREATE TABLE dep_temp AS SELECT * from dep where 1=2';
EXECUTE IMMEDIATE
'ALTER TABLE dep
    EXCHANGE PARTITION t1
    WITH TABLE dep_temp
    WITHOUT VALIDATION
    UPDATE GLOBAL INDEXES';
EXECUTE IMMEDIATE
'create table t1_temp for exchange with table dep';
EXECUTE IMMEDIATE
'ALTER TABLE dep
EXCHANGE PARTITION t1
WITH TABLE t1_temp
WITHOUT VALIDATION';
END IF;
END;
/

CREATE TABLE dep3(
             dep_id NUMBER(4) NOT NULL,
             dep_nm VARCHAR2(30),
             c_id NUMBER(4) NOT NULL);
创建触发器abc
在数据库上创建后
开始

如果TRIGGER_NESTLEVEL()这确实是一个有趣的触发器用例,因为我会“担心”数据库中突然出现的对象。通常DDL我们希望在生产系统上受到相当仔细的监控。无论如何,选项可以是您设置的包变量,例如

CREATE TRIGGER abc
AFTER CREATE ON DATABASE
BEGIN
  if not pkg.i_am_already_in_the_trigger then
    pkg.i_am_already_in_the_trigger := true;
    EXECUTE IMMEDIATE ....
    pkg.i_am_already_in_the_trigger := false;
  end if;
EXCEPTION WHEN OTHERS THEN
  pkg.i_am_already_in_the_trigger := false;
  raise;
END;

您不能在触发器内创建表。使用“立即执行”我可以在触发器内创建表。@a\u horse\u加了一个\u no\u名称的工作查询为什么要这样做?看起来太复杂了。你想实现什么样的商业目标?@OldProgrammer我有一套步骤要遵循。我们刚刚将它们转换为pl/sql语句。