我的桌子上有一些桌子,很多人都可以使用。现在我的表中缺少一些数据。如何找到从该表中删除这些行的人。
答案 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 (我不记得是谁发布的)