【问题标题】:update value into another table using trigger使用触发器将值更新到另一个表中
【发布时间】:2015-12-03 07:31:01
【问题描述】:

使用列 StudentId(varchar 类型)、Marks(双精度)创建表数据。使用列 StudentId(varchar 类型)、OldMarks (Double)、NewMarks、Date 创建表 data1。

在数据表上创建触发器。如果标记发生更改,则在 data1 表中为具有旧标记、新标记和当前日期的学生创建条目。

这是我尝试过的代码:

CREATE TRIGGER marksss ON [dbo].[data] after UPDATE 
AS declare @studentid int; 
declare @marks int; 
declare @xyz int; 
declare @newmarks int; 
declare @oldmarks int; 
select @studentid=i.student_id from inserted i; 
--to fetch inserted values 
select @marks=i.marks from inserted i; 
begin if update(marks) --set @oldmarks=@mark set @newmarks=@marks 
insert into data1(student_id,new_marks,old_marks,date) 
values (@studentid,@newmarks,@oldmarks,getdate()enter code here); 
end 
go

问题是它不显示旧标记

【问题讨论】:

  • 在 UPDATE AS 声明 @studentid int 之后创建触发器标记 [dbo].[data];声明@marks int;声明@xyz int;声明@newmarks int;声明@oldmarks int;从插入的 i 中选择 @studentid=i.student_id; -- 获取插入的值 select @marks=i.marks from inserted i;开始 if update(marks) --set @oldmarks=@mark set @newmarks=@marks 插入 data1(student_id,new_marks,old_marks,date) 值 (@studentid,@newmarks,@oldmarks,getdate()enter code here) ;结束去
  • 请标记使用的 dbms。 (看起来根本不像 ANSI SQL...)
  • 对于旧值,您需要deleted
  • data1的用途是什么?您可以只在第一个表中包含一个时间戳列,这将是您的历史记录。只需使用人员 ID 选择并按时间戳排序即可获得最新的。

标签: sql-server tsql triggers


【解决方案1】:

我已经设法得到你想要的。首先,您想使用 an 而不是触发器。 Oracle 有一个 before 触发器,这是您理想的需要,但是 MSSQL 没有此功能,因此我们也必须手动执行传入的更新...

这是我使用的带有表格设置的代码,只是根据您的需要进行了更改。

CREATE TABLE A (ID INT IDENTITY PRIMARY KEY, SCORE INT)

CREATE TABLE B (ID INT FOREIGN KEY REFERENCES A(ID), SCORE INT, OLDSCORE INT, [date] DATETIME)

GO

CREATE TRIGGER marksss ON A INSTEAD OF UPDATE 
AS 
BEGIN 
    IF (SELECT A.SCORE FROM A INNER JOIN INSERTED I ON I.ID = A.ID) != (SELECT I.SCORE FROM INSERTED I)
BEGIN
    INSERT INTO B(ID,SCORE,OLDSCORE,[date])
    SELECT I.ID, I.SCORE, A.SCORE, GETDATE()
    FROM INSERTED I
    INNER JOIN A ON I.ID = A.ID 
END
BEGIN
    UPDATE A
    SET SCORE = (SELECT I.SCORE FROM INSERTED I)
END
END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2011-04-12
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    相关资源
    最近更新 更多