AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

    • 主页
    • 系统&网络
    • Ubuntu
    • Unix
    • DBA
    • Computer
    • Coding
    • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-124809

Steve H.'s questions

Martin Hope
Steve H.
Asked: 2017-05-15 21:59:42 +0800 CST

识别表和连续行之间的字段更改

  • 2

我需要构建一个审计报告来识别两个表之间以及其中一个表中连续行之间的字段更改。第一个表(数据)保存当前数据:

id  data_id field1  field2  data_dttm
1   100     data3   data3   2017-05-03 00:00:00.000

CREATE TABLE [dbo].[data](
[id] [bigint] NULL,
[data_id] [nchar](10) NULL,
[field1] [nchar](10) NULL,
[field2] [nchar](10) NULL,
[adt_dttm] [datetime] NULL
)

Insert INTO data 
Values (1, 100, 'data3', 'data3', '2017-05-03 00:00:00')

第二个表 (data_hst) 在数据发生变化(触发类型操作)之前保存数据。

data_hst_id data_id field1  field2  chng_fld_txt    data_dttm
1           100     data1   data2   field1|field2   2017-05-01 00:00:00.000
2           100     data2   data3   field1          2017-05-02 00:00:00.000

CREATE TABLE [dbo].[data_hst](
[data_hst_id] [bigint] NULL,
[data_id] [bigint] NULL,
[field1] [nvarchar](200) NULL,
[field2] [nvarchar](200) NULL,
[chng_fld_txt] [nvarchar](200) NULL,
[data_dttm] [datetime] NULL
)

Insert INTO data_hst
Values (1, 100, 'data1', 'data2', 'field1|field2', '2017-05-01 00:00:00'),
       (2, 100, 'data2', 'data3', 'field1', '2017-05-02 00:00:00')

“chng_fld_txt”字段包含已修改的字段列表,以竖线分隔。我需要确定数据表行和最近的 data_hst 表行之间发生了什么变化,以及 data_hst 表中连续行之间的变化。跟踪每个更改的审计报告,在它们发生时识别旧值和新值。

结果是这样的:

table_name  db_field    old_value   new_value   data_dttm
data        field1      data1       data2       5/1/2017
data        field2      data2       data3       5/1/2017
data        field1      data2       data3       5/2/2017

我有一些复杂的动态 sql,其中有一个游标适用于第一个条件,但不能同时适用于这两个条件。希望有一种更清洁的方法来满足这两个条件。

    DROP TABLE #changed

    CREATE TABLE #changed(
        [tbl_hst_id] [bigint] NULL,
        [change_field] [nvarchar](200) NULL
    ) ON [PRIMARY]

    DECLARE @db VARCHAR(200)
    SET @db = 'data'
    DECLARE @change_date DATETIME
    DECLARE @change_date_varchar NVARCHAR(200)
    SET @change_date = GETDATE()
    SET @change_date_varchar = LEFT(CONVERT(VARCHAR, @change_date, 120), 10)

    DECLARE @changed_table nvarchar(max)
    SELECT @changed_table = 
    'SELECT TOP 2 t1.' + @db + '_hst_id as tbl_hst_id, t1.change_field
    FROM (
        SELECT A.' + @db + '_hst_id
            ,Split.a.value(''.'', ''VARCHAR(100)'') AS change_field
        FROM (
            SELECT ' + @db + '_hst_id
                ,CAST(''<M>'' + REPLACE(upsrt_chng_fld_txt, '','', ''</M><M>'') + ''</M>'' AS XML) AS String
                ,adt_dttm
            FROM ' + @db + '_hst
            ) AS A
        CROSS APPLY String.nodes(''/M'') AS Split(a)
        WHERE adt_dttm >= DATEADD(D,-4,''' + @change_date_varchar + ''')
        ) T1
    WHERE T1.change_field NOT IN (
            ''upsrt_dttm''
            ,''upsrt_trnsctn_nmbr''
            )'

    exec ('insert #changed ' + @changed_table)

    DECLARE @delta_field VARCHAR(max)
    DECLARE @db_sql_all NVARCHAR(max) = ''

    DECLARE @getDeltaField CURSOR SET @getDeltaField = CURSOR
    FOR
    SELECT change_field
    FROM #changed

    OPEN @getDeltaField

    FETCH NEXT
    FROM @getDeltaField
    INTO @delta_field

    WHILE @@FETCH_STATUS = 0
    BEGIN

        DECLARE @db_sql NVARCHAR(MAX)

        SELECT @db_sql = 'select ''' + @db + ''' as table_name
            , ''1'' as id
            ,''' + @delta_field + ''' as db_field
            ,CAST(hst.' + @delta_field + ' AS NVARCHAR(200)) as old_value
            ,CAST(c.' + @delta_field + ' AS NVARCHAR(200)) as new_value
            --,c.upsrt_usr_id as change_by
            --,c.upsrt_dttm as change_time
            from ' + @db + ' c
            inner join ' + @db + '_hst hst
            on c.' + @db + '_id = hst.' + @db + '_id
            join #changed ch on hst.' + @db + '_hst_id = ch.tbl_hst_id
            UNION '

        SET @db_sql_all = @db_sql_all + @db_sql

        FETCH NEXT
        FROM @getDeltaField
        INTO @delta_field
    END

    CLOSE @getDeltaField

    DEALLOCATE @getDeltaField
    IF len(@db_sql_all) > 0
    BEGIN
        SET @db_sql_all = SUBSTRING(@db_sql_all, 1, len(@db_sql_all) - 6)
    END

    PRINT(@db_sql_all);
    EXEC (@db_sql_all);
sql-server row
  • 1 个回答
  • 323 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助
subwaysurfers
my femboy roommate

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve