CREATE
OR
REPLACE
TRIGGER
resumable_default
?
AFTER
SUSPEND
ON
DATABASE
DECLARE
?
/* declare transaction in this trigger is autonomous */
?
/* this is not required because transactions within a trigger are always autonomous */
?
PRAGMA
AUTONOMOUS_TRANSACTION
;
? cur_sid????????
NUMBER
;
? cur_inst???????
NUMBER
;
? errno??????????
NUMBER
;
? err_type???????
VARCHAR2
;
? object_owner???
VARCHAR2
;
? object_type????
VARCHAR2
;
? table_space????
VARCHAR2
;
? sub_object_name
VARCHAR2
;
? error_txt??????
VARCHAR2
;
? msg_body???????
VARCHAR2
;
? ret_value??????
BOOLEAN
;
? mail_conn?????? UTL_SMTP.CONNECTION;
BEGIN
?
-- Get session ID
?
SELECT
DISTINCT
(SID)
INTO
cur_SID
FROM
V$MYSTAT;
?
-- Get instance number
? ret_value := DBMS_RESUMABLE.SPACE_ERROR_INFO(err_type,
?????????????????????????????????????????????? object_type,
?????????????????????????????????????????????? object_owner,
??????????????????????????
????????????????????table_space_name,
?????????????????????????????????????????????? object_name,
?????????????????????????????????????????????? sub_object_name);
?
/*
? -- If the error is related to rollback segment, log error, send email
? -- to DBA, and abort the segment. Otherwise, set timeout to a8 hours.
? --
? -- sys.rbs_error is created by DBA manually and defined as
? -- sql_text VARCHAR2(1000), error_msg VARCHAR2(4000),
? -- suspend_time DATE
? */
?
IF
OBJECT_TYPE =
'ROLLBACK SEGMENT'
THEN
???
/* LOG ERROR */
???
INSERT
INTO
sys.rbs_error
????? (
SELECT
SQL_TEXT, ERROR_MSG, SUSPEND_TIME
????????
FROM
DBMS_RESUMABLE
???????
WHERE
SESSION_ID = cur_sid
?????????
AND
INSTANCE_ID = cur_inst);
???
SELECT
ERROR_MSG
?????
INTO
error_txt
?????
FROM
DBMS_RESUMABLE
????
where
SESSION_ID = cur_sid
??????
AND
INSRANCE_ID = cur_inst;
???
-- Send email to receipient via UTL_SMTP package
??? msg_body? :=
'Subject: Space Error Occurred
Space limit reached for rollback segment'
|| object_name ||
'on'
||
??????????
??????TO_CHAR(
SYSDATE
,
'Month dd, YYYY, HH:MIam'
) ||
????????????????
'. Error message was'
|| error_txt;
??? mail_conn := UTL_SMTP.OPEN_CONNECTION(
'localhost'
,
25
);
??? UTL_SMTP.HELO(mail_conn,
'localhost'
);
??? UTL_SMTP.MAIL(mail_conn,
'sender@localhost'
);
??? UTL_SMTP.RCPT(mail_conn,
'recipient@localhost'
);
??? UTL_SMTP.DATA(mail_conn, msg_body);
??? UTL_SMTP.QUIT(mail_conn);
???
-- Abort the segment
??? DBMS_RESUMABLE.ABORT(cur_sid);
?
ELSE
???
-- Set timeout to 8 hours
??? DBMS_RESUMABLE.SET_TIMEOUT(
28800
);
?
END
IF
;
?
/* commit autonomous transaction */
?
COMMIT
;
END
;