首页 > 解决方案 > 我们如何安排作业在 Oracle (sql developer 或 Toad) 中运行,以触发最近连接到特定数据库的邮件

问题描述

有没有办法让我最近连接到特定数据库的所有用户连同他们的主机名一起。我想以作业的形式触发这个 Sql 或过程,并安排 oracle 中的作业每隔一小时运行一次。

请建议任何选项。

标签: oraclejobs

解决方案


下面的 PL/SQL 块创建一个查看审计跟踪的作业,创建一个在过去一小时内登录的用户和主机的列表,并通过电子邮件发送结果。

在代码可以工作之前,您可能必须安装UTL_MAIL

sqlplus sys/<pwd>
SQL> @$ORACLE_HOME/rdbms/admin/utlmail.sql
SQL> @$ORACLE_HOME/rdbms/admin/prvtmail.plb

您可能还需要设置参数SMTP_OUT_SERVER,并可能在数据库中配置 ACL 以授予您发送电子邮件的权限。只需按照错误消息并使用 Google 来修复它们。

如果您的数据库尚未审核连接,请运行:

audit connect;

最后,创建如下所示的作业。这是一个非常简单的文本格式电子邮件,使用DBMS_SCHEDULERDBA_AUDIT_TRAILUTL_MAIL

--Create an hourly job to email the last hours worth of logons.
begin
    dbms_scheduler.create_job(
        job_name        => 'hourly_logons',
        job_type        => 'plsql_block',
        start_date      => systimestamp at time zone 'US/Eastern',
        repeat_interval => 'freq=hourly;byminute=0;',
        enabled         => true,
        job_action      =>
        q'[
            declare
                v_message varchar2(32767);
            begin
                --Create the message based on audit entries.
                for rows in
                (
                    select username, userhost, count(*) the_count
                    from dba_audit_trail
                    where timestamp > systimestamp - interval '1' hour
                        and action_name = 'LOGON'
                    group by username, userhost
                    order by 1,2
                ) loop
                    v_message := v_message || rows.username || chr(9) || rows.userhost || chr(9) ||
                        rows.the_count || chr(10);
                end loop;

                --Email the message
                utl_mail.send
                (
                    sender     => 'some_address@some_domain.com',
                    recipients => 'some_address@some_domain.com',
                    subject    => 'Logons in past hour',
                    message    => v_message
                );
            end;
        ]'
    );
end;
/

您可能希望在测试期间手动运行作业,并检查调度程序元数据:

--Force the job to run:
begin
    dbms_scheduler.run_job('HOURLY_LOGONS');
end;
/

--Check the job status and history.
select * from dba_scheduler_jobs where job_name = 'HOURLY_LOGONS';
select * from dba_scheduler_job_run_details where job_name = 'HOURLY_LOGONS' order by log_date desc;

上面的代码没有经过测试,因为我的家用机器上没有设置邮件服务器。但是我之前已经做过好几次了,并且确信非常接近这个的东西应该可以工作。


推荐阅读