SQL 触发器使另一个 table 保持最新
SQL Trigger for keeping another table up to date
我以前没有使用过触发器,但它们似乎是解决这个问题的方法。
我想要一个 table,其中包含来自两个 table 的最新记录:Item_Master
和 Dev_Master
-> Union_Master
我主要不明白的是插入和删除'tables'。如果我想更新一行(更新一行时),如何访问插入的 tables 列?
这是我目前的情况:
ALTER TRIGGER [dbo].[DevMasterChangeTrigger]
ON [dbo].[DEV_MASTER]
AFTER INSERT, UPDATE, DELETE
AS
DECLARE @UpdateType nvarchar(1)
DECLARE @UpdatedDT datetime
SELECT @UpdatedDT = CURRENT_TIMESTAMP
SET NOCOUNT ON;
IF EXISTS (SELECT * FROM inserted)
IF EXISTS (SELECT * FROM deleted)
SELECT @UpdateType = 'U' -- Update Trigger
ELSE
SELECT @UpdateType = 'I' -- Insert Trigger
ELSE
IF EXISTS (SELECT * FROM deleted)
SELECT @UpdateType = 'D' -- Delete Trigger
ELSE
SELECT @UpdateType = NULL; -- Unknown Operation
IF @UpdateType = 'I'
BEGIN
PRINT 'Insert'
END
IF @UpdateType = 'U'
BEGIN
UPDATE dbo.UNION_MASTER
SET PRDNO = inserted.PRDNO & 'abc'
WHERE dbo.DEV_MASTER.PRDNO = inserted.PRDNO
END
IF @UpdateType = 'D'
BEGIN
PRINT 'Delete'
END
另外,有没有关于沉浸在 MS SQL Server 中的好书?
编辑:好的,对于任何偶然发现此问题的人 post,我已经弄明白了。希望我没有错过任何导致问题的细微差别。删除部分对我来说有点困惑...
USE [abc]
GO
/****** Object: Trigger [dbo].[DevMasterChangeTrigger] Script Date: 10/04/15 12:43:43 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[DevMasterChangeTrigger]
ON [dbo].[DEV_MASTER]
AFTER INSERT, UPDATE, DELETE
AS
DECLARE @UpdateType nvarchar(1)
DECLARE @UpdatedDT datetime
SELECT @UpdatedDT = CURRENT_TIMESTAMP
IF EXISTS (SELECT * FROM inserted)
IF EXISTS (SELECT * FROM deleted)
SELECT @UpdateType = 'U' -- Update Trigger
ELSE
SELECT @UpdateType = 'I' -- Insert Trigger
ELSE
IF EXISTS (SELECT * FROM deleted)
SELECT @UpdateType = 'D' -- Delete Trigger
ELSE
SELECT @UpdateType = NULL; -- Unknown Operation
IF @UpdateType = 'I'
BEGIN
INSERT INTO [UNION_MASTER]
(PRDID, {Insert various fields here})
SELECT [inserted].[PRDID], [inserted].{Insert various fields here}
FROM inserted
END
IF @UpdateType = 'U'
BEGIN
UPDATE [UNION_MASTER]
SET
[UNION_MASTER].[abcdfield]=[inserted].[abcdfield], {other fields here}
FROM inserted
WHERE [UNION_MASTER].[PRDNO]=inserted.prdno
END
IF @UpdateType = 'D'
BEGIN
declare @prdno varchar(50)
SELECT @prdno= PRDNO FROM deleted
DELETE
FROM UNION_MASTER
WHERE PRDNO = @prdno
END
简而言之,inserted
和deleted
table是特殊的table,可以在DML触发器中使用。这些 table 包含基于对触发器执行的 DML 操作的行。
inserted
table 包含为 insert
语句插入的行的数据或在 update
的情况下新修改的行
已删除 table 包含在 delete
操作中删除的行或在 update
的情况下已修改的旧数据
在你的触发器中,你可以尝试这样的事情
ALTER TRIGGER [dbo].[DevMasterChangeTrigger]
ON [dbo].[DEV_MASTER]
AFTER INSERT, UPDATE, DELETE
AS
DECLARE @UpdateType nvarchar(1)
DECLARE @UpdatedDT datetime
SELECT @UpdatedDT = CURRENT_TIMESTAMP
SET NOCOUNT ON;
IF EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted)
SELECT @UpdateType = 'U' -- Update Trigger
ELSE IF EXISTS(SELECT * FROM inserted)
SELECT @UpdateType = 'I' -- Insert Trigger
ELSE IF EXISTS (SELECT * FROM deleted)
SELECT @UpdateType = 'D' -- Delete Trigger
ELSE
SELECT @UpdateType = NULL; -- Unknown Operation
IF @UpdateType = 'I'
BEGIN
PRINT 'Insert'
// add appropriate logic here
END
IF @UpdateType = 'U'
BEGIN
UPDATE U dbo.UNION_MASTER
SET PRDNO = inserted.PRDNO & 'abc'
FROM dbo.UNION_MASTER U
inner join inserted i -- this table will have the rows affected from update statement for table DEV_MASTER
on i.<UNION_MASTER_ID> = U.<UNION_MASTER_ID> -- USE appropriate joining condition
END
IF @UpdateType = 'D'
BEGIN
PRINT 'Delete'
// add appropriate logic here
END
参考链接
我以前没有使用过触发器,但它们似乎是解决这个问题的方法。
我想要一个 table,其中包含来自两个 table 的最新记录:Item_Master
和 Dev_Master
-> Union_Master
我主要不明白的是插入和删除'tables'。如果我想更新一行(更新一行时),如何访问插入的 tables 列?
这是我目前的情况:
ALTER TRIGGER [dbo].[DevMasterChangeTrigger]
ON [dbo].[DEV_MASTER]
AFTER INSERT, UPDATE, DELETE
AS
DECLARE @UpdateType nvarchar(1)
DECLARE @UpdatedDT datetime
SELECT @UpdatedDT = CURRENT_TIMESTAMP
SET NOCOUNT ON;
IF EXISTS (SELECT * FROM inserted)
IF EXISTS (SELECT * FROM deleted)
SELECT @UpdateType = 'U' -- Update Trigger
ELSE
SELECT @UpdateType = 'I' -- Insert Trigger
ELSE
IF EXISTS (SELECT * FROM deleted)
SELECT @UpdateType = 'D' -- Delete Trigger
ELSE
SELECT @UpdateType = NULL; -- Unknown Operation
IF @UpdateType = 'I'
BEGIN
PRINT 'Insert'
END
IF @UpdateType = 'U'
BEGIN
UPDATE dbo.UNION_MASTER
SET PRDNO = inserted.PRDNO & 'abc'
WHERE dbo.DEV_MASTER.PRDNO = inserted.PRDNO
END
IF @UpdateType = 'D'
BEGIN
PRINT 'Delete'
END
另外,有没有关于沉浸在 MS SQL Server 中的好书?
编辑:好的,对于任何偶然发现此问题的人 post,我已经弄明白了。希望我没有错过任何导致问题的细微差别。删除部分对我来说有点困惑...
USE [abc]
GO
/****** Object: Trigger [dbo].[DevMasterChangeTrigger] Script Date: 10/04/15 12:43:43 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[DevMasterChangeTrigger]
ON [dbo].[DEV_MASTER]
AFTER INSERT, UPDATE, DELETE
AS
DECLARE @UpdateType nvarchar(1)
DECLARE @UpdatedDT datetime
SELECT @UpdatedDT = CURRENT_TIMESTAMP
IF EXISTS (SELECT * FROM inserted)
IF EXISTS (SELECT * FROM deleted)
SELECT @UpdateType = 'U' -- Update Trigger
ELSE
SELECT @UpdateType = 'I' -- Insert Trigger
ELSE
IF EXISTS (SELECT * FROM deleted)
SELECT @UpdateType = 'D' -- Delete Trigger
ELSE
SELECT @UpdateType = NULL; -- Unknown Operation
IF @UpdateType = 'I'
BEGIN
INSERT INTO [UNION_MASTER]
(PRDID, {Insert various fields here})
SELECT [inserted].[PRDID], [inserted].{Insert various fields here}
FROM inserted
END
IF @UpdateType = 'U'
BEGIN
UPDATE [UNION_MASTER]
SET
[UNION_MASTER].[abcdfield]=[inserted].[abcdfield], {other fields here}
FROM inserted
WHERE [UNION_MASTER].[PRDNO]=inserted.prdno
END
IF @UpdateType = 'D'
BEGIN
declare @prdno varchar(50)
SELECT @prdno= PRDNO FROM deleted
DELETE
FROM UNION_MASTER
WHERE PRDNO = @prdno
END
简而言之,inserted
和deleted
table是特殊的table,可以在DML触发器中使用。这些 table 包含基于对触发器执行的 DML 操作的行。
inserted
table 包含为 insert
语句插入的行的数据或在 update
已删除 table 包含在 delete
操作中删除的行或在 update
在你的触发器中,你可以尝试这样的事情
ALTER TRIGGER [dbo].[DevMasterChangeTrigger]
ON [dbo].[DEV_MASTER]
AFTER INSERT, UPDATE, DELETE
AS
DECLARE @UpdateType nvarchar(1)
DECLARE @UpdatedDT datetime
SELECT @UpdatedDT = CURRENT_TIMESTAMP
SET NOCOUNT ON;
IF EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted)
SELECT @UpdateType = 'U' -- Update Trigger
ELSE IF EXISTS(SELECT * FROM inserted)
SELECT @UpdateType = 'I' -- Insert Trigger
ELSE IF EXISTS (SELECT * FROM deleted)
SELECT @UpdateType = 'D' -- Delete Trigger
ELSE
SELECT @UpdateType = NULL; -- Unknown Operation
IF @UpdateType = 'I'
BEGIN
PRINT 'Insert'
// add appropriate logic here
END
IF @UpdateType = 'U'
BEGIN
UPDATE U dbo.UNION_MASTER
SET PRDNO = inserted.PRDNO & 'abc'
FROM dbo.UNION_MASTER U
inner join inserted i -- this table will have the rows affected from update statement for table DEV_MASTER
on i.<UNION_MASTER_ID> = U.<UNION_MASTER_ID> -- USE appropriate joining condition
END
IF @UpdateType = 'D'
BEGIN
PRINT 'Delete'
// add appropriate logic here
END
参考链接