Я модифицировал скрипт Flood для выполнения раз для каждой таблицы, а не для каждого столбца каждой таблицы для более быстрого выполнения. Для этого требуется Oracle 11g или больше.
set serveroutput on size 100000
declare
v_match_count integer;
v_counter integer;
-- The owner of the tables to search through (case-sensitive)
v_owner varchar2(255) := 'OWNER_NAME';
-- A string that is part of the data type(s) of the columns to search through (case-insensitive)
v_data_type varchar2(255) := 'CHAR';
-- The string to be searched for (case-insensitive)
v_search_string varchar2(4000) := 'FIND_ME';
-- Store the SQL to execute for each table in a CLOB to get around the 32767 byte max size for a VARCHAR2 in PL/SQL
v_sql clob := '';
begin
for cur_tables in (select owner, table_name from all_tables where owner = v_owner and table_name in
(select table_name from all_tab_columns where owner = all_tables.owner and data_type like '%' || upper(v_data_type) || '%')
order by table_name) loop
v_counter := 0;
v_sql := '';
for cur_columns in (select column_name from all_tab_columns where
owner = v_owner and table_name = cur_tables.table_name and data_type like '%' || upper(v_data_type) || '%') loop
if v_counter > 0 then
v_sql := v_sql || ' or ';
end if;
v_sql := v_sql || 'upper(' || cur_columns.column_name || ') like ''%' || upper(v_search_string) || '%''';
v_counter := v_counter + 1;
end loop;
v_sql := 'select count(*) from ' || cur_tables.table_name || ' where ' || v_sql;
execute immediate v_sql
into v_match_count;
if v_match_count > 0 then
dbms_output.put_line('Match in ' || cur_tables.owner || ': ' || cur_tables.table_name || ' - ' || v_match_count || ' records');
end if;
end loop;
exception
when others then
dbms_output.put_line('Error when executing the following: ' || dbms_lob.substr(v_sql, 32600));
end;
/
Задания PowerShell (типа PSJob) выполняются в отдельном процессе, поэтому они не имеют никакого доступа к среде вызывающей программы, даже к переменным в глобальной области.
Чтобы получить информацию в задании, вы должны определить блок param()
в блоке сценария задания, а затем использовать параметр -ArgumentList
в Start-Job
для отправки значений. Обратите внимание, что это будет однократная передача значений .
Чтобы вернуть данные из задания, вы просто отправляете их по конвейеру, как обычно, и для доступа к данным вам нужно будет использовать Get-Job
, чтобы определить, есть ли у задания «дополнительные данные», и если это так , вы используете Receive-Job
для извлечения этих данных.
К сожалению, все это означает, что вам все еще нужен ваш основной поток для управления фоновым заданием, чтобы победить цель.
Вы можете вместо заглянуть в [117] и связать его с каким-то объектом .Net, который может вызывать события. Похоже, что они выполняются в процессе, но более того, они могут запускаться на основе событий, которые могут вас заинтересовать, без управления циклом.
Итак, в самом простом и, возможно, просто для ознакомления вы можете взглянуть на пример таймера, где объект таймера запускает событие с интервалом:
$timer = new-object timers.timer
$action = {write-host "Timer Elapse Event: $(get-date -Format ‘HH:mm:ss’)"}
$timer.Interval = 3000 #3 seconds
Register-ObjectEvent -InputObject $timer -EventName elapsed –SourceIdentifier thetimer -Action $action
$timer.start()
#to stop run
$timer.stop()
#cleanup
Unregister-Event thetimer
Но примеры на странице Microsoft даже включают мониторинг события создания процесса из WMI, так что и / или и событие выхода из процесса (?), Возможно, стоит посмотреть.