Проверьте, какая процедура изменяла данные в IBM Netezza - PullRequest
0 голосов
/ 16 июня 2020

Я обнаружил, что Netezza хранит историю данных в схеме HISDB. Можно ли присоединиться к ним, чтобы я мог получить историю того, какая таблица была изменена какой процедурой? набор данных в ту же таблицу. Мне нужно, чтобы все события были задокументированы для целей передачи данных.

Текущий запрос, который я сделал, возвращает время вызова процедуры. Проблема связана с подключением к USER_HISTDB."$hist_table_access_3". Единственное совпадающее поле - NPSINSTANCEID. LOGENTRYID, OPID и SESSIONID имеют разные значения.

Это мешает мне создать ссылку на процедуру для таблицы.

SELECT 
b.SUBMITTIME,
b.QUERYTEXT,
b.USERNAME,
b.DBNAME,
b.SCHEMANAME,
a.*
FROM USER_HISTDB."$hist_log_entry_3" a
JOIN USER_HISTDB."$hist_query_prolog_3" b
ON a.LOGENTRYID = b.LOGENTRYID
AND a.SESSIONID = b.SESSIONID 
AND a.NPSID = b.NPSID
AND a.NPSINSTANCEID = b.NPSINSTANCEID

WHERE b.QUERYTEXT like '%PROCEDURE_NAME%'

Ответы [ 2 ]

2 голосов
/ 24 июня 2020
-- By default, information about stored procedures is not logged
-- in the query history database. To enable logging of such ...
set ENABLE_SPROC_HIST_LOGGING = on;

-------------------------------------------------------------------------

-- TABLE -- All Info About All Accesses
-- ====================================

SELECT

    QP.submittime,
    substr(QP.querytext, 1, 100) as  SQL_STATEMENT,
    xid,                             --  the transaction id (which might be either a CREATEXID or DELETEXID)
    username,

    CASE
        when usage =   1 then  'SELECTED'
        when usage =   2 then  'INSERTED'
        when usage =   3 then  'SELECTED/INSERTED'
        when usage =   4 then  'DELETED'
        when usage =   5 then  'SELECTED/DELETED'
        when usage =   8 then  'UPDATED'
        when usage =   9 then  'SELECTED/UPDATED'
        when usage =  16 then  'TRUNCATED'
        when usage =  32 then  'DROPPED'
        when usage =  64 then  'CREATED'
        when usage = 128 then  'GENSTATS'
        when usage = 256 then  'LOCKED'
        when usage = 512 then  'ALTERED'
                         else  'other'
    END AS OPERATION,

    TA.dbname,
    TA.schemaname,
    TA.tablename,
    TA.tableid,
    PP.planid       -- The MAIN query plan (not all table operations involve a query plan)

    -- If you want to see EVERYTHING, uncomment the next line.
    -- Or pick and choose the columns you want to see.
    --    ,*

FROM

    ---- SESSION information
                     "$hist_session_prolog_3"  SP
    left outer join  "$hist_session_epilog_3"  SE  using ( SESSIONID, npsid, npsinstanceid )

    ---- QUERY information (to include the SQL statement that was issued)
    left outer join  "$hist_query_prolog_3"    QP  using ( SESSIONID, npsid, npsinstanceid )
    left outer join  "$hist_query_epilog_3"    QE  using ( OPID,      npsid, npsinstanceid )

    left outer join  "$hist_table_access_3"    TA  using ( OPID,      npsid, npsinstanceid )

    ---- PLAN information
    ---- Not all queries result in a query plan (for example, TRUNCATE and DROP do not)
    ---- And some queries might result in multiple query plans (such as a GROOM statement)
    ---- By including these joins we might get multiple rows (for any given row in the $hist_table_access_3 table)
    left outer join  "$hist_plan_prolog_3"   PP  using ( OPID,      npsid, npsinstanceid )
    left outer join  "$hist_plan_epilog_3"   PE  using ( PLANID,    npsid, npsinstanceid )

WHERE

    (ISMAINPLAN isnull or ISMAINPLAN = true)
     ---- So ...
     ---- If there is NO plan file (as with a truncate) ... then ISMAINPLAN will be null.  Include this row.
     ---- If there is a plan file, include ONLY the record corresponding to the MAIN plan file.
     ---- (Otherwise, there could end up being a lot of duplicated information).

     and TA.tableid > 200000
     ---- Ignore access information for SYSTEM tables (where the OBJID # < 200000)

----
----Add any other restrictions here (otherwise, this query as written will return a lot of data)
----

ORDER BY 1;
1 голос
/ 19 июня 2020

Идентификатор транзакции уникален для каждого выполнения данного оператора и отображается в записи в таблице (скрытые столбцы с именами CreateXid и DeleteXid). Тот же самый идентификатор можно найти в таблицах HISTDB.

Вам нужна помощь с запросом к этим таблицам?

...