如何在sql server中找到从我的表中删除数据的人

时间:2017-06-30 06:47:42

标签: sql-server

我的桌子上有一些桌子,很多人都可以使用。现在我的表中缺少一些数据。如何找到从该表中删除这些行的人。

3 个答案:

答案 0 :(得分:2)

您可以使用ApexSQL日志来全面调查针对您的表执行的操作。数据库需要处于完全恢复模型中,因此有关过去操作的信息可在事务日志文件中找到,以便ApexSQL Log读取它。一旦工具分析了t-log,您将能够看到操作开始和结束的时间,操作类型,受影响对象的模式和对象名称,执行操作的用户的名称等等。对于UPDATE,您甚至可以看到更新字段的旧值和新值。

这里有几个指南https://solutioncenter.apexsql.com/apexsql-log-solutions-table-of-contents/

此外,如果需要,您甚至可以使用ApexSQL Log回滚这些事务。它只会简单地撤消'它们和回滚更改回原始状态。

答案 1 :(得分:0)

不幸的是,如果你不把它们留在某个地方,你就看不到删除的记录。

如果您想跟踪此类干预措施,则不应删除您的记录。 相反,您应该在表格上创建更多字段。 这是一个例子:

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Person](
[Pers_ID] [int] IDENTITY(1,1) NOT NULL,
[Pers_CompanyID] [int] NULL,
[Pers_FirstName] [nvarchar](50) NULL,
[Pers_LastName] [nvarchar](50) NULL,
[Pers_CreatedBy] [int] NULL,
[Pers_CreatedDate] [datetime] NULL,
[Pers_UpdatedBy] [int] NULL,
[Pers_UpdatedDate] [datetime] NULL,
[Pers_Deleted] [bit] NULL,
 CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED 
(
[Pers_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY =     OFF,     ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

当用户创建记录时,您可以设置CreatedBy = UserID,CreatedDate = CurrentDate,

更新记录时,UpdatedBy = UserID,UpdatedDate = CurrentDate

并删除,Deleted = True,UpdatedBy = UserID,UpdatedDate = CurrentDate。

在您的代码中,在所有查询中,您应添加条件Deleted = null。

因此,您可以跟踪创建,更新或删除记录的人员。

答案 2 :(得分:0)

您可以通过以下小片段找到已删除数据的用户名:

DECLARE @TableName sysname
SET @TableName = 'dbo.t1_new'   --INPUT TABLE NAME

SELECT
    u.[name] AS UserName
    , l.[Begin Time] AS TransactionStartTime
FROM
    fn_dblog(NULL, NULL) l
INNER JOIN
    (
    SELECT
        [Transaction ID]
    FROM 
        fn_dblog(NULL, NULL) 
    WHERE
        AllocUnitName LIKE @TableName + '%'
    AND
        Operation = 'LOP_DELETE_ROWS'
    ) deletes
ON  deletes.[Transaction ID] = l.[Transaction ID]
INNER JOIN
    sysusers u
ON  u.[sid] = l.[Transaction SID]

来源:dba.stackexchange (我不记得是谁发布的)