3、监控数据库关闭/启动的触发器
create or replace trigger TR_DB_SHUTDOWN
before shutdown ON DATABASE
DECLARE
msMsg VARCHAR2(500);
BEGIN
msMsg :='user '||ora_login_user||' in '
||ora_client_ip_address||' ready shutdown database '
||ora_database_name|| ' now';
sp_send_mail('urmail@mail.com',msMsg);
EXCEPTION
WHEN OTHERS THEN
sp_send_mail(' urmail@mail.com ',ora_database_name||' shutdown error');
END; |
说明:当数据库关闭之前,发送Mail到指定邮箱.不要在关闭/启动数据库的触发器中调用utl_file包写文件,可能会导致BUG,引起数据库不能启动,如果实在有必要,则关闭数据库与启动数据库不要使用同一个会话。
4、监控登录用户的触发器
先需要建立一张表,用于存放登陆信息。
create table LOG$INFORMATION
(
ID NUMBER(10),
USERNAME VARCHAR2(30),
LOGINTIME DATE,
TERMINAL VARCHAR2(50),
IPADRESS VARCHAR2(20),
OSUSER VARCHAR2(30),
MACHINE VARCHAR2(64),
PROGRAM VARCHAR2(64),
SID NUMBER,
SERIAL# NUMBER,
AUSID NUMBER
) |
然后需要创建一个序列,才产生连续的序列号,根据序列的信息,可以更好的得到登录的信息。
create sequence SQ_LOGIN
minvalue 1
maxvalue 999999999
start with 1
increment by 1
cache 20; |
最后创建触发器,记载登录信息。
CREATE OR REPLACE TRIGGER TR_LOGIN_RECORD
AFTER logon ON DATABASE
DECLARE
mtSession v$session%ROWTYPE;
CURSOR cSession(iiQuerySid IN NUMBER) IS
SELECT * FROM v$session
WHERE audsid = iiQuerySid;
BEGIN
OPEN cSession(userenv('SESSIONID'));
FETCH cSession INTO mtSession;
IF cSession%FOUND THEN
INSERT INTO log$information(id,username,logintime,terminal,ipadress,osuser,machine,
program,sid,serial#,ausid)
VALUES(sq_login.nextval,USER,SYSDATE,mtSession.Terminal,
SYS_CONTEXT ('USERENV','IP_ADDRESS'),mtSession.Osuser,
mtSession.Machine,mtSession.Program,mtSession.
Sid,mtSession.Serial#,userenv('SESSIONID'));
ELSE
sp_write_log('session信息错误:'||SQLERRM);
raise_application_error(-20099,'登录异常错误',FALSE);
END IF;
CLOSE cSession;
EXCEPTION
WHEN OTHERS THEN
sp_write_log('登记登录信息错误:'||SQLERRM);
RAISE;
END; |
说明:这个触发器监控所有登录用户,并把其信息存入到以上表中。根据表中记载的信息,可以获得所有登录信息,用于审计用户的登陆是否许可。 |