我有一个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”。
答案 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())