SQL - 作为更新日志触发

SQL - trigger as log of update

我的表是:
-冲锋队
-小队
-排

Stormtrooper 将 'ID' 作为主键,将 'squadID' 作为外键,小队将 'ID' 作为主键,将 'platoonID' 作为外键,排将 'ID'作为主键。

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

CREATE TRIGGER log AFTER UPDATE ON stormtrooper

但我不知道如何在一个触发器中显示包含该冲锋队的冲锋队、小队和排的数据。

在接下来的步骤中,我将针对您的问题向您展示一个示例。 因此,让我们创建基本 tables.

的示例
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)
);

您应该创建一个 table 以使用触发器来记录更新。所以让我们创建 table.

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

现在为 table 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 个 table 用于 insert/update/delete。插入使用 Inserted,删除使用 Deleted。更新条目首先被标记为已删除,然后插入(使用新值)到已插入。因此,您可以比较 Inserted 和 Deleted 的值以获得您的更改。 您可以根据自己的具体要求创建更多用例。

要阅读日志,您只需 SELECT * FROM LOG_TABLE。 您可以在 http://sqlfiddle.com/#!3/c926cd/1.

处找到包含一些数据的示例

希望对您有所帮助。