Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL Server使用触发器更新日志时出现问题_Sql_Sql Server_Triggers_Sql Update - Fatal编程技术网

使用SQL Server使用触发器更新日志时出现问题

使用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

我正在尝试创建一个更高难度的触发器,它允许我在更新alumns表中的行之后创建一个日志

| 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