当一个表在模式中创建(MYSCHEMA)时,我需要创建一个触发器,在插入每个创建的表之前生成一个ID列(来自序列)。 我怎么能意识到这一点?
我知道,如何通过触发器和序列实现ID列的生成,如下所示:
CREATE OR REPLACE TRIGGER TR1
BEFORE INSERT ON TB1
FOR EACH ROW
BEGIN
SELECT SQ1.nextval
INTO :new.primary_key_column
FROM dual;
END;
但我不知道如何使用AFTER CREATE ON SCHEMA
触发器在我CREATE TABLE
的模式BEFORE INSERT
之后创建触发器...
我已经写了这段代码:
CREATE OR REPLACE TRIGGER /*APPROOT*/after_create_table_trigger
AFTER CREATE ON APPROOT.SCHEMA
DECLARE
TABLE_NAME VARCHAR2(100);
BEGIN
IF ORA_DICT_OBJ_TYPE = 'TABLE' THEN
SELECT ORA_DICT_OBJ_NAME INTO TABLE_NAME FROM DUAL;
EXECUTE IMMEDIATE
('CREATE OR REPLACE TRIGGER id_table_gen
BEFORE INSERT ON ' || TABLE_NAME ||
' FOR EACH ROW
BEGIN
SELECT APPROOT.AE_IDSEQ.NEXTVAL
INTO :new.ID
FROM dual;
END;');
END IF;
END;
/
然后我创建了一个带有一个字段ID的测试表,但是我的触发器没有工作...... 我认为使用事件属性函数ora_dict_obj_name的原因是错误的。
有人可以就此提出建议吗?
谢谢。
答案 0 :(得分:0)
就可以了。
SQL> connect sys/test as sysdba
Connected.
SQL> CREATE OR REPLACE TRIGGER after_create_table_trigger
2 AFTER CREATE ON TEST.SCHEMA
3 DECLARE
4 TABLE_NAME VARCHAR2(100);
5 BEGIN
6 IF ORA_DICT_OBJ_TYPE = 'TABLE' THEN
7 SELECT ORA_DICT_OBJ_NAME INTO TABLE_NAME FROM DUAL;
8 EXECUTE IMMEDIATE
9 ('CREATE OR REPLACE TRIGGER ID_TABLE_GEN
10 BEFORE INSERT ON TEST.' || TABLE_NAME ||
11 ' FOR EACH ROW
12 BEGIN
13 SELECT TEST.AE_IDSEQ.NEXTVAL
14 INTO :new.ID
15 FROM dual;
16 END;');
17 END IF;
18 END;
19 /
Trigger created.
SQL> connect test/test
Connected.
SQL> create table mytab(id number primary key, a varchar2(1));
Table created.
SQL> insert into mytab (a) values ('a');
1 row created.
SQL> select * From mytab;
ID A
---------- -
1 a
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE 10.2.0.4.0 Production
TNS for Linux: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production
P.S。无需做
SELECT ORA_DICT_OBJ_NAME INTO TABLE_NAME FROM DUAL;
只需将其粘贴到命令中即可。
CREATE OR REPLACE TRIGGER ID_TABLE_GEN
BEFORE INSERT ON APPROOT.' || ORA_DICT_OBJ_NAME ||