Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92409225
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-12 14:07:45

    来源:csdn    作者:q30


[Q]如何修改默认的XDB监听端口

[A]Oracle9i默认的XML DB把HTTP的默认端口设为8080,这是一个太常用的端口了,很多别的WebServer都会使用这个端口,

如果我们安装了它,最好修改一下,避免冲突,如果不使用呢,就最好不要安装

提供三种修改的方法

1.dbca,选择你的数据库,然后Standard Database Features->Customize->Oracle XML DB option,进入这个画面你应该就知道怎么改了。

2.OEM console,在XML Database 的配置里面修改

3.用oracle提供的包:

-- 把HTTP/WEBDAV端口从8080改到8081

SQL> call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(), 
'/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()',8081)) 
/ 
-- 把FTP端口从2100改到2111 
SQL> call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(), 
'/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()',2111)) 
/ 
SQL> commit; 
SQL> exec dbms_xdb.cfg_refresh; 
-- 检查修改是否已经成功 
SQL> select dbms_xdb.cfg_get from dual;


[Q]怎么捕获用户登录信息,如SID,IP地址等

[A]可以利用登录触发器,如

CREATE OR REPLACE TRIGGER tr_login_record
AFTER logon ON DATABASE
DECLARE
miUserSid NUMBER;
mtSession v$session%ROWTYPE;
CURSOR cSession(iiUserSid IN NUMBER) IS
SELECT * FROM v$session
WHERE sid=iiUserSid;
BEGIN
SELECT sid INTO miUserSid FROM v$mystat WHERE rownum<=1;
OPEN cSession(miUserSid);
FETCH cSession INTO mtSession;
--if user exists then insert data
IF cSession%FOUND THEN
INSERT INTO log$information(login_user,login_time,ip_adress,ausid,terminal, 
osuser,machine,program,sid,serial#)
VALUES(ora_login_user,SYSDATE,SYS_CONTEXT ('USERENV','IP_ADDRESS'), 
userenv('SESSIONID'),
mtSession.Terminal,mtSession.Osuser,
mtSession.Machine,mtSession.Program,
mtSession.Sid,mtSession.Serial#);
ELSE
--if user don't exists then return error
sp_write_log('Session Information Error:'||SQLERRM);
CLOSE cSession;
raise_application_error(-20099,'Login Exception',FALSE);
END IF;
CLOSE cSession;
EXCEPTION
WHEN OTHERS THEN
sp_write_log('Login Trigger Error:'||SQLERRM);
END tr_login_record;

在以上触发器中需要注意以下几点

1、该用户有v_$session与v_$mystat的对象查询权限,可以在sys下对该拥护显式授权。

2、sp_write_log原本是一个写日志的过程,可以置换为自己的需要,如null跳过。

3、必须在创建该触发器之前创建一个log$information的表记录登录信息。


[Q]怎么捕获整个数据库的DDL语句或者是说对象结构变化与修改

[A]可以采用DDL触发器,如

CREATE OR REPLACE TRIGGER tr_trace_ddl
AFTER DDL ON DATABASE 
DECLARE
sql_text ora_name_list_t;
state_sql ddl$trace.ddl_sql%TYPE;
BEGIN
FOR i IN 1..ora_sql_txt(sql_text) LOOP
state_sql := state_sql||sql_text(i);
END LOOP;
INSERT INTO ddl$trace(login_user,ddl_time,ip_address,audsid,
schema_user,schema_object,ddl_sql)
VALUES(ora_login_user,SYSDATE,userenv('SESSIONID'),
sys_context('USERENV','IP_ADDRESS'),
ora_dict_obj_owner,ora_dict_obj_name,state_sql);
EXCEPTION 
WHEN OTHERS THEN 
sp_write_log('Capture DDL Excption:'||SQLERRM);
END tr_trace_ddl;

在创建以上触发器时要注意几点

1、必须创建一个ddl$trace的表,用来记录ddl的记录

2、sp_write_log原本是一个写日志的过程,可以置换为自己的需要,如null跳过。

阅读(192) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~