【问题标题】:How to Use Trigger to Log Changes in SQL Server?如何使用触发器记录 SQL Server 中的更改?
【发布时间】:2021-07-31 07:30:50
【问题描述】:

Users表:

LoginLog表:

UsersLastLogonTime 列更新并插入一行时,如何将名称、密码、LastLogonTime 记录到LoginLog 表?

【问题讨论】:

  • 为什么您首先要以纯文本形式存储密码? 永远不要那样做。用盐对密码进行哈希处理并存储它们。
  • 根据问题指南,请展示您尝试过的内容并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。并且请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。

标签: sql sql-server tsql triggers


【解决方案1】:

您需要一个相当简单的触发器来更新Users 表。更棘手的部分是要意识到每个语句仅触发一次触发器这一事实 - 这样的语句可能会更新 multiple rows 然后将在您的@987654322 @ 和 Deleted 触发器中的伪表。

您需要编写触发器以了解这种基于集合的方式并正确处理它。为了能够正确链接旧值和新值,您的表 Users 必须 有一个正确的主键(您没有提及任何相关内容) - 类似于 UserId 或之类的。

试试这样的:

CREATE TRIGGER dbo.trg_LogUserLogon
ON dbo.Users
FOR UPDATE
AS
    -- inspect the Inserted (new values, after UPDATE) and Deleted (old values, before UPDATE) 
    -- pseudo tables to find out which rows have had an update in the LastLogonTime column
    INSERT INTO dbo.LoginLog (Name, Password, LastLogonTime) 
        SELECT
            i.Name, i.Password, i.LastLogonTime
        FROM
            Inserted i
        INNER JOIN
            -- join the two sets of data on the primary key (which you didn't specify)
            -- could be i.UserId = d.UserId or something similar
            Deleted d on i.PrimaryKey = d.PrimaryKey
        WHERE
            -- only select those rows that have had an update in the LastLogonTime column
            i.LastLogonTime <> d.LastLogonTime

但也请无论如何考虑@Larnu的cmets关于不永远以纯文本形式存储密码!这确实是一件非常糟糕的事情,需要不惜一切代价避免。

【讨论】:

  • 考虑到最近出现在新闻中的纯文本密码泄露数据的频率,以及愚蠢到这样做的公司/人有多么愚蠢,老实说,我担心有多少人继续做同样的事情错误...
  • @Larnu:完全同意——这让我大吃一惊
猜你喜欢
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多