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的主要内容,如果未能解决你的问题,请参考以下文章