Sql 触发器无法正常工作,删除到 logtable

Posted

技术标签:

【中文标题】Sql 触发器无法正常工作,删除到 logtable【英文标题】:Sql trigger not working correctly, deleting to logtable 【发布时间】:2015-06-08 07:59:02 【问题描述】:

此触发器旨在将密码更改记录到日志表中,当您更改密码时,旧密码进入表,并且它将为 5 个密码执行此操作,当超过 5 个时,它将删除旧密码为新密码腾出空间

ALTER TRIGGER [dbo].[CheckCount]
       ON  [dbo].[LogPassword]
       AFTER INSERT
    AS 
    BEGIN
        SET NOCOUNT ON
        DECLARE @nummer int
        set @nummer = (Select count(*) from logpassword WHERE beheerderID = (SELECT u.beheerderid FROM INSERTED u)) 
        IF (@nummer > 5)
        BEGIN   
        DELETE FROM logpassword WHERE changedate = (SELECT MIN(changedate) from logpassword) AND beheerderID = (SELECT u.beheerderid FROM INSERTED u
    END

这应该从 LogTable 中删除最旧的行,现在当您只有 1 个 ID,如果表中有 5 行,并且您更改密码,插入最新的,并且最旧的将被删除。但是,如果你有 2 个人(2 个 ID),一个仍然可以工作,但另一个会超过 5 到无穷大,我认为问题出在

AND beheerderID = (SELECT u.beheerderid FROM INSERTED u

我试图让它工作,但我不明白问题是什么,这使得解决问题有点困难:/

【问题讨论】:

明文密码?没有。没有。 =子选有点吓人,做IN子选,以防万一。 每个人都对它说不,我知道它不好,但它的哈希值哈哈:P 【参考方案1】:

那行有问题:

DELETE FROM logpassword WHERE changedate = (SELECT MIN(changedate) from logpassword) AND beheerderID = (SELECT u.beheerderid FROM INSERTED u)

当您检查 min(changedate) 时,您会得到所有用户的最小值,而不是只查看具有相同 beheerderid 的行。

更改您的子选择:

(SELECT MIN(changedate) from logpassword)

这个:

(SELECT MIN(changedate) from logpassword where beheerderID=(SELECT u.beheerderid FROM INSERTED u) )

【讨论】:

哇..我现在感觉有点笨,是我笨吗? :P 非常感谢队友! jejeje,我们通常需要2只以上的眼睛。 ;)

以上是关于Sql 触发器无法正常工作,删除到 logtable的主要内容,如果未能解决你的问题,请参考以下文章

无法在 View SQL Server 2005 上执行删除

PL/SQL ORACLE:删除时触发更新

SQL用触发器实现 2个表 数据关联,插入更新和删除?

时间驱动的触发器无法正常工作

表单提交触发器无法正常工作

NSManagedObject 删除无法正常工作