SQL - 作为更新日志触发

时间:2015-06-05 01:59:10

标签: sql triggers sqlite

我的表是:
-stormtrooper
-squad
-platoon

Stormtrooper有' ID'作为主键和' squadID'作为外国人,小队有ID'作为主键和< platoonID'因为外国和排有“ID'作为主键。

使用触发器我想显示连接到我更新的stormtrooper的所有内容。

CREATE TRIGGER log AFTER UPDATE ON stormtrooper

但我不知道如何在一个包括这个冲锋队员的冲锋队,小队和排的触发数据中显示。

1 个答案:

答案 0 :(得分:2)

在以下步骤中,我将向您展示一个问题示例。 因此,让我们创建基本表的示例。

CREATE TABLE PLATOON (
  id int identity(1,1) primary key,
  name nvarchar(20)
);

CREATE TABLE SQUAD (
  id int identity(1,1) primary key,
  name nvarchar(20),
  platoonId int,
  constraint fk_platoon foreign key(platoonId) references PLATOON(id)
);

CREATE TABLE STORMTROOPER (
  id int identity(1,1) primary key,
  rank nvarchar(20),
  squadId int,
  constraint fk_squad foreign key(squadId) references SQUAD(id)
);

您应该使用触发器记录更新来创建用于记录的表。所以我们创建表。

CREATE TABLE LOG_TABLE
(
  id int identity(1,1) primary key,
  logText nvarchar(200)
);

现在创建一个触发器,用于更新表STORMTROOPER的条目。

CREATE TRIGGER log ON STORMTROOPER
AFTER UPDATE
AS
BEGIN
  INSERT INTO LOG_TABLE
  select 'updated stormstrooper ' + cast(d.id as nvarchar) + ' in ' + SQUAD.[name] + ' of ' + PLATOON.[name] + ' from rank ' + d.[rank] + ' to ' + i.[rank]
  from deleted d
  inner join inserted i on (i.ID = d.ID)
  inner join SQUAD on SQUAD.[id] = i.[squadId]
  inner join PLATOON on PLATOON.[id] = SQUAD.[platoonId]
END

这是记录更新的示例。 MS SQL有2个表用于插入/更新/删除。插入使用已插入和已删除使用已删除。首先将更新条目标记为已删除,然后在已插入中插入(带有新值)。因此,您可以比较已插入和已删除的值以获取更改。 您可以根据具体要求创建更多用例。

要阅读日志,您只需SELECT * FROM LOG_TABLE。 您可以在http://sqlfiddle.com/#!3/c926cd/1找到包含一些数据的示例。

我希望这会有所帮助。