Как мы можем запланировать работу для запуска в Oracle (SQL Developer или Toad), чтобы вызвать почту, кто недавно подключен к конкретной базе данных - PullRequest
1 голос
/ 03 июля 2019

Есть ли способ, как я могу подключить всех пользователей, недавно подключенных к определенной базе данных, вместе с их именем хоста. Я хочу, чтобы запустить эту Sql или процедуру в виде задания и запланировать выполнение задания в Oracle, чтобы запускать каждый час.

Пожалуйста, предлагайте любые варианты.

1 Ответ

1 голос
/ 04 июля 2019

Приведенный ниже блок 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_SCHEDULER, DBA_AUDIT_TRAIL и UTL_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;

Приведенный выше код не проверен, поскольку на моем домашнем компьютере не настроен почтовый сервер. Но я уже делал это несколько раз и уверен, что что-то очень близкое к этому должно сработать.

...