create table GGBA03A
(
GGBA03A010 VARCHAR2(36),
GGBA03A020 VARCHAR2(36),
GGBA03A030 VARCHAR2(50),
GGBA03A040 VARCHAR2(50),
GGBA03A050 VARCHAR2(50),
GGBA03A060 NUMBER(3) not null,
PRIMARY KEY(GGBA03A060)
)我建了一个基于DATABASE的触发器,拦截alter表事件create or replace trigger tri_test_db
after ALTER on DATABASE
Begin insert into GGBA03A
(GGBA03A010, GGBA03A020, GGBA03A030, GGBA03A040, GGBA03A050)
values
(sys.sysevent,
sys.dictionary_obj_type,
sys.dictionary_obj_name,
(select count(a.column_name)
from user_tab_cols a
where a.table_name = sys.dictionary_obj_name),
(select sysdate from dual));End;这时有个问题,如果是 alter table test add (sex varchar2(2)); 时,
得到的 count(a.column_name) 列数是添加之前的,而在修改列名和删除列名时,得到的列数又是实时的。
有没有达人遇到过类似问题!
(
GGBA03A010 VARCHAR2(36),
GGBA03A020 VARCHAR2(36),
GGBA03A030 VARCHAR2(50),
GGBA03A040 VARCHAR2(50),
GGBA03A050 VARCHAR2(50),
GGBA03A060 NUMBER(3) not null,
PRIMARY KEY(GGBA03A060)
)我建了一个基于DATABASE的触发器,拦截alter表事件create or replace trigger tri_test_db
after ALTER on DATABASE
Begin insert into GGBA03A
(GGBA03A010, GGBA03A020, GGBA03A030, GGBA03A040, GGBA03A050)
values
(sys.sysevent,
sys.dictionary_obj_type,
sys.dictionary_obj_name,
(select count(a.column_name)
from user_tab_cols a
where a.table_name = sys.dictionary_obj_name),
(select sysdate from dual));End;这时有个问题,如果是 alter table test add (sex varchar2(2)); 时,
得到的 count(a.column_name) 列数是添加之前的,而在修改列名和删除列名时,得到的列数又是实时的。
有没有达人遇到过类似问题!
解决方案 »
- 求教:Enterprise linux 5上安装oracle 10g出现的问题
- Oracle 关于使用SQLdeveloper 查询出来的值有E
- 角色问题
- 华为的一条数据库查询优化笔试题
- 这个 sql语句怎么写(急)
- 在两个表联合查询时 出现问题 ORA-00600: 内部错误代码, 参数: [19004], [], [], [], [], [], [], []
- oracle->SQLserver 傻
- 为什么我用NET8连接服务,测试一会儿失败,一会儿成功?()
- Oracle 数据库应用变慢怎么解决!!!急!!!
- 查询换表怎么写sql语句
- 在oracle中求一sql语句 (急)
- Oracle 8i中能否使用Pipe向其他进程发送消息?
如下的代码,把你的user_tab_columns改成了dba_tab_columns没有问题,都是之前的column的数目。 你再仔细查查。create or replace trigger tri_test_db
after ALTER on DATABASE
declare
v number;
begin
dbms_output.put_line('Event type:'||sys.sysevent);
dbms_output.put_line('Object type:'||sys.dictionary_obj_type);
dbms_output.put_line('Object name:'||sys.dictionary_obj_name);
select count(a.column_name) into v from dba_tab_cols a where a.table_name
=sys.dictionary_obj_name;
dbms_output.put_line('Columns:'||v);
end;
/
比如说一张表原先有2列,现在添加了4列,理论上应该是6列,但触发器中通过 user_tab_cols 视图查询出来的只有5列。如何获取最新添加的列?
修改了一下上面的,改成
select count(a.column_name) into v from dba_tab_cols a where a.table_name=sys.dictionary_obj_name and owner=user;不过测试,update是不变的,delete确实是删除以后的column的个数。刚才我自己看错了。