如何使用每日记录更新SQL表?

时间:2019-07-11 06:52:18

标签: sql sql-server

我有一个SQL数据库,该数据库的某些表每天都会更新。我想创建另一个表,该表每天更新一次,其中记录更新了哪些表(表名称,修改/更新日期)。我也不希望该表太大,因此我希望该表仅保留最近31天的记录。我将如何为此编写代码?

我已经创建了一个表(tUpdatedTables),但我希望该表每天更新一次,并将这些记录保留31天

这就是我创建表格的方式

Select *

Into tUpdatedTables
from sys.tables
order by modify_date desc

我尝试插入“更新”代码来更新表,但出现错误

update tUpdatedTables
    set [name]
      ,[object_id]
      ,[principal_id]
      ,[schema_id]
      ,[parent_object_id]
      ,[type]
      ,[type_desc]
      ,[create_date]
      ,[modify_date]
      ,[is_ms_shipped]
      ,[is_published]
      ,[is_schema_published]
      ,[lob_data_space_id]
      ,[filestream_data_space_id]
      ,[max_column_id_used]
      ,[lock_on_bulk_load]
      ,[uses_ansi_nulls]
      ,[is_replicated]
      ,[has_replication_filter]
      ,[is_merge_published]
      ,[is_sync_tran_subscribed]
      ,[has_unchecked_assembly_data]
      ,[text_in_row_limit]
      ,[large_value_types_out_of_row]
      ,[is_tracked_by_cdc]
      ,[lock_escalation]
      ,[lock_escalation_desc]
      ,[is_filetable]
      ,[is_memory_optimized]
      ,[durability]
      ,[durability_desc]
      ,[temporal_type]
      ,[temporal_type_desc]
      ,[history_table_id]
      ,[is_remote_data_archive_enabled]
      ,[is_external] 
--Into tUpdatedTables
from sys.tables
where modify_date >= GETDATE()
order by modify_date desc
  

消息2714,级别16,状态6,第4行,已经有一个名为   数据库中的“ tUpdatedTables”。

1 个答案:

答案 0 :(得分:0)

  

我想创建另一个表,该表每天更新一次,其中记录了哪些表(表名,修改/更新日期)的更新。

如果这是您想要的,我建议您仅进行每日备份。无论如何,您都应该这样做。


除此之外,您正在寻找的是审核日志。大多数语言和框架都有库为您执行此操作。例如,paper_trail

如果您想自己执行此操作,请遵循paper_trail的基本模式。

  • id作为自动递增的主键
  • item_type可能是表格,或更抽象些
  • item_id是项目的主键
  • event是存储创建,更新还是删除?
  • bywho标识谁进行了更改
  • object包含数据转储的json字段
  • created_at发生的情况(使用默认设置)

Using JSON是使此表通用的关键。您不必使用表FOR JSON存储该行的JSON转储,而不必尝试存储每个可能的表的每个可能的列,也不必随着表的变化而保持最新。这意味着审核表不需要随着其他表的更改而更改。而且,由于避免了审计表中有许多未使用的列,因此将节省大量磁盘空间。

例如,这是您记录用户23创建some_table的ID 5的方式。(由于我不使用SQL Server,所以我可能会有点失望)。

insert into audit_log (item_type, item_id, event, bywho, object)
values(
  'some_table', 5, 'create', 23, (
    select * from some_table where id = 5 for json auto
  )
)

由于审核表不关心所记录事物的结构,因此可以对每个表使用插入,更新和删除触发器,以将其更改记录在审核日志中。只需更改item_type

至于不要变得太大,在出现问题之前不要担心。正确的索引编制将不会有问题:(item_type, item_id)上的复合索引将使对特定事物的更改快速列出。索引bywho将使搜索特定事物所做的更改很快。您不应该在生产中引用这个东西。如果您是,则可能需要不同的设计。

Partitioning the table by month也可以避免扩展问题。

如果它太大了,您可以备份表并使用created_at删除旧条目。

delete from audit_log
where created_at < dateadd(day, -31, getdate())