我如何知道SQL数据库在一定时间内发生了什么变化?

我如何知道SQL数据库在一定时间内发生了什么变化?,sql,sql-server,Sql,Sql Server,我有一个管理公司打印机的系统,我需要了解网站和数据库之间的工作流程,通过了解用户每次交互时在数据库中添加/更改的内容。是否有一种方法可以为数据库甚至整个SQL Server查找或创建某种类型的日志,以显示我需要的内容?在某些情况下,您可以使用扩展事件功能: 我想你要找的是触发器。 您可以创建表来记录当前更新或更改的数据,并使用触发器在任何更改时自动向日志表中提供数据 CREATE OR REPLACE TRIGGER [trigger_name] BEFORE DELETE OR INSERT

我有一个管理公司打印机的系统,我需要了解网站和数据库之间的工作流程,通过了解用户每次交互时在数据库中添加/更改的内容。是否有一种方法可以为数据库甚至整个SQL Server查找或创建某种类型的日志,以显示我需要的内容?

在某些情况下,您可以使用扩展事件功能:


我想你要找的是触发器。 您可以创建表来记录当前更新或更改的数据,并使用触发器在任何更改时自动向日志表中提供数据

CREATE OR REPLACE TRIGGER [trigger_name]
BEFORE DELETE OR INSERT OR UPDATE ON [table_name] 
  FOR EACH ROW 
  WHEN [some condition] 
  DECLARE 
  [variable declaration]
  BEGIN 
     [create an entry in the log table here]
  END; 

您可以使用新的和旧的关键字来引用数据(新的是指最新的数据更新)

只是为了记录,一个专门用于此目的的工具已经存在,并与SQL Server一起安装,它被称为SQL Server Profiler。

可能重复的是DDL,@Sami,我理解为用户指的是DML。无论哪种方式,在我看来,最好的方法就是在SP中处理DML语句,这并不容易实现。您应该以这种方式设计数据级别。这意味着有一个更新和插入的跟踪。当然,有一个良好的手册阅读,关于@Larnu CDC是DML,没有?@Sami肯定;我目前在我的两个productions SQLS系统中使用它,但这些天我会使用内置的工具,而不是使用自己的工具。问题标记为
SQL Server
tag@CaiusJard,它不支持
REPLACE
,并且该代码会在“REPLACE”错误附近抛出不正确的语法。SQL Server的语法完全错误。SQL Server也不支持每行的
,表的
名称应在触发器名称之后。访问Eesh。。这是StackOverflow的问题之一;人们太迂腐了。当一个问题被问到并回答时,这并不意味着OP已经将开发的全部责任交给了一个在互联网上的陌生人,他必须提供一个考虑到所有意外情况的绝对完美的解决方案,因此有理由要求他们修复像“第6行缺少分号”这样空洞的东西-OP仍然对开发负有最终责任,而您正在就语法的一个方面争论不休,这是一个令人毛骨悚然的问题。很明显这是伪代码;拆下
或更换
,然后让它go@CaiusJard很抱歉,这是我第一次发布答案,你能解释一下为什么这不是正确的方法吗?萨米的抱怨是你没有提供一个文本完美的解决方案,Op可以直接复制和运行。我担心的是,尽管它可以工作,但SQL server内置了此功能,因此无需使用触发器和历史记录表“污染”应用程序数据域。大多数dba通常不赞成使用触发器,用于更改跟踪的msdn在某种程度上贬低了这种方法。我认为答案不应该被否决,因为它不一定是错的,就像用刀当螺丝刀也不一定是错的一样。。只是SQL server有一把螺丝刀:)