使用SQL Server使用触发器更新日志时出现问题
我正在尝试创建一个更高难度的触发器,它允许我在更新alumns表中的行之后创建一个日志使用SQL Server使用触发器更新日志时出现问题,sql,sql-server,triggers,sql-update,Sql,Sql Server,Triggers,Sql Update,我正在尝试创建一个更高难度的触发器,它允许我在更新alumns表中的行之后创建一个日志 | Alumn_ID | Name | Courses | Favourite_Course 1 Peter 5 Math 例如,如果有人将课程数量从5个更新为6个,那么这就是结果 | Log_ID | Alumn_ID | Note | NoteID | Change_Date
| Alumn_ID | Name | Courses | Favourite_Course
1 Peter 5 Math
例如,如果有人将课程数量从5个更新为6个,那么这就是结果
| Log_ID | Alumn_ID | Note | NoteID | Change_Date | Last_Change_Date
1 1 Fields were Updated Note 1 2018-04-23 00:00:00.000 2018-03-23 00:00:00.000
这是我当前的触发器
ALTER TRIGGER [LOG]
ON ALUMNS
AFTER UPDATE
AS
BEGIN
DECLARE @Note VARCHAR(50)
DECLARE @Alumn_ID varchar;
SELECT @Alumn_ID= INSERTED.Alumn_ID FROM INSERTED
SET @Note = 'Fields were updated'
INSERT INTO Alumn_Log (Log_ID, Alumn_ID, Note, NoteID, Change_Date)
SELECT Log_ID, i.Alumn_ID, @Note, NoteID, GETDATE(); FROM INSERTED i
END
我的问题是:
如何创建无法从插入的i中获取的日志ID和便笺ID?
我的第二个问题是,如何插入当前日期?当我尝试执行查询时,它告诉我不能在insert中使用该变量。
我的第三个问题是,我该如何填写最后的更改日期?
第四,有没有一种方法可以键入一个特定的注释?例如,如果只更改了名称,那么应该说名称已更改?
最后,注释ID将是Varchar而不是identity,并且每个注释ID都需要不同
这是当前唯一一个阻止我运行查询的错误:
这是我得到的消息273,级别16,状态1,过程日志_触发器,第19行[批处理开始行0]me time stamp使用带列列表的INSERT排除timestamp列或在timestamp列中插入默认值
如何插入当前日期?当我尝试执行查询时
告诉我不能在插入中使用该变量
将分号从上面的行中去掉
SELECT Log_ID, i.Alumn_ID, @Note, NoteID, GETDATE() FROM INSERTED i
以下是我将如何处理它 如何创建无法从中获取的日志ID和便笺ID 我? 日志Id可以是自动标识列。带有标识INSERT的INT列。 注释ID可以是一个自动递增的计算列,如下代码所示。您可能需要引入一个用作前缀的新列 我的第二个问题是,如何插入当前日期?当我试图 执行查询,它告诉我不能在中使用该变量 插入。 GETDATE 我的第三个问题是,我该如何填写最后的更改日期? 您可以使用INSERTED创建联接,并从上一行的日志中获取值。显示在代码中 第四,是否有一种方法可以键入特定的注释(例如,如果 名字变了应该说名字变了 这将取决于在哪个列上找到更新的性质。这与其说是技术问题,不如说是商业问题 最后,注释ID将是Varchar而不是identity,并且每个注释ID都需要不同 现在,代码将覆盖整个模式 创建表日志 Log_ID INT IDENTITY1,1不为空, 校友国际, 注:VARCHAR200, 前缀VARCHAR30, NOTEID为[PREFIX]+右'0000000'+CASTLog_ID为VARCHAR7,7, 更改日期日期时间, LASTCHANGEDATE日期时间 ; 创建表明矾 校友国际, 名字是VARCHAR50, 国际课程, 最喜欢的课程VARCHAR50 ; 创建触发器[训练日志] 论明矾 更新后 像 开始 声明@Note VARCHAR50 -声明@Alumn\u ID VARCHAR50 声明@lastchangedatetime -选择@Alumn\u ID=INSERTED.Alumn\u ID FROM INSERTED SET@Note='字段已更新' 从日志l中选择@Lastchange=CHANGEDATE 在l.Alumn\u ID上插入的内部联接i=i.Alumn\u ID -内连接铝 在LOGAlumn_ID、注释、前缀、更改日期、LASTCHANGEDATE中插入 选择i.Alumn\u ID、@Note、'AUP',GETDATE、@Lastchange FROM INSERTED i
你在你的触发代码中犯了一个新手错误。触发多行火灾。如果使用非主键的WHERE子句进行更新,则插入的集合将拥有更新的每一行。因此,您的语句不会像您所想的那样,只在INSERTED中插入最后一行,而不是每一行。您必须使用集合操作,而不是标量变量来尝试选择一个列值。@pmbAustin不完全是。。他在填充@Alumn\u ID时犯了这个错误,但是@Alumn\u ID永远不会在代码的其余部分使用,所以最终效果不会受到这个错误的影响。他在最后一次日志插入中连接到插入的表。@Alumn\u ID行只是可以删除的无用行。谢谢,这对日期有效,但如何声明日志ID和便笺ID自动插入?取决于您希望它们是什么。我尝试过这样做,但当我执行查询时,它告诉我不能随时间向列中插入显式值。我应该使用insert排除或使用DEFAULT请提供足够的信息来重现此错误,这里没有足够的信息来帮助您进一步解决此问题。您没有从问题中发布的代码中获得此错误。编辑问题并将您的实际代码放入其中,否则我们无法帮助您。非常感谢,LOG_ID字段已经存在,并且在表ALUMN中为Varchar20
SELECT Log_ID, i.Alumn_ID, @Note, NoteID, GETDATE() FROM INSERTED i