Database 在Oracle db触发器中设置递归级别
我正在处理一个pl/sql用例,在这个用例中,我需要为“create”创建一个触发器,并在触发器内部再次创建一个表。是否有一种方法可以将递归级别设置为1,类似于Oracle db中的sql server。请建议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
编辑: 添加触发器和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语句。