我有一个SQL Server表,其中包含以下列:
我需要能够比较特定客户端的所有行,并查看哪些列已更改/修改。
我通常的方法是连接客户端每一行的所有列,并比较连接的字符串。
但不知怎的,我知道可能有更好的方法(除了我的方法并没有真正告诉我哪些列是更改以及值之前/之后)。
任何建议都会有所帮助。请注意,我无法进行任何DBA级别的更改,例如跟踪更改等。非常感谢。
答案 0 :(得分:0)
完成此任务的选项是创建历史记录表,并创建插入,更新和删除触发器。然后,您可以查询历史记录表以查找所需的所有详细信息。
示例代码:
CREATE TRIGGER [dbo].[uTests]
ON [dbo].[Tests]
AFTER DELETE,UPDATE
AS
BEGIN
SET NOCOUNT ON;
-- Log updated/delete record
INSERT INTO [dbo].[Tests_TransHistory]
(ID
,[Test_Name]
,[TestDate]
,[UpdateDate]
,[UpdateUser]
SELECT
ID
,[Test_Name]
,[TestDate]
,[UpdateDate]
,[UpdateUser]
FROM DELETED;
--Update the time stamps.
IF NOT EXISTS(SELECT * FROM INSERTED)
BEGIN
UPDATE dbo.Tests_TransHistory
SET UpdateDate = getdate(), UpdateUser = current_user
WHERE TransID = SCOPE_IDENTITY();
END
ELSE
BEGIN
UPDATE a
SET a.UpdateDate = getdate(), a.UpdateUser = current_user
FROM dbo.Tests a, INSERTED b
WHERE a.ID = b.ID
END
END

答案 1 :(得分:0)
如果您无法启用查询通知并使用SqlDependancy Class ...
您可以在表格中添加ROWVERSION
类型的列。每次更新行时,SQL Server都会使用新的唯一ROWVERSION
值更新varbinary(8)
类型的列。使用此方法,您可以检查ROWVERSION
列是否发生了更改并跳过这些行。如果它们不匹配,那么您可以单独检查这些行中的字段。
另一种选择是使用HASHBYTES函数来检测变化。如果您的客户端下拉视图...您可以在选择中添加散列值。类似的东西:
select *,
HASHBYTES ('MD5', Clientnum) ClientnumHash,
HASHBYTES ('MD5', Location) LocationHash,
HASHBYTES ('MD5', Benifits) BenifitsHash,
HASHBYTES ('MD5', SomeOtherFields) SomeOtherFieldsHash
from Table
然后你可以比较散列函数的结果,比较varbinary(16)(MD5方法的最大长度)而不是列的整个字符串。