Sql server 在另一个表中插入SQL Server触发器信息
我创建了一个表Sql server 在另一个表中插入SQL Server触发器信息,sql-server,triggers,Sql Server,Triggers,我创建了一个表tblAddress,我想使用触发器。当IINSERT/DELETE或UPDATE时,这些更改应保存在另一个表中-锁表中。我是SQL Server的初学者,你能帮我解决这个问题吗 我只是做了这么多。我要存储触发器信息的另一个表名为tru Lock Create Trigger tr_tblAddress_ForInsertDeleteUpdate On tblAddress After Insert,Delete,Update As Print 'You Deleted,
tblAddress
,我想使用触发器。当IINSERT/DELETE
或UPDATE
时,这些更改应保存在另一个表中-锁表中。我是SQL Server的初学者,你能帮我解决这个问题吗
我只是做了这么多。我要存储触发器信息的另一个表名为tru Lock
Create Trigger tr_tblAddress_ForInsertDeleteUpdate
On tblAddress
After Insert,Delete,Update
As
Print 'You Deleted, Inserted, Updated one row from tblAddress';
这是您案例的示例数据
CREATE TABLE BILL (BILL_NBR INT IDENTITY PRIMARY KEY, BILL_NME VARCHAR(50),CREATE_DTE DATETIME, MODIFY_DTE DATETIME)
GO
CREATE TABLE LOG_BILL (LOG_BILL_NBR INT IDENTITY PRIMARY KEY, LOG_DTE DATETIME, BILL_NBR INT, BILL_NME VARCHAR(50)
,CREATE_DTE DATETIME, MODIFY_DTE DATETIME)
GO
CREATE TRIGGER [dbo].[TRG_BILL_LOG] ON [dbo].BILL
AFTER UPDATE,DELETE
AS
INSERT INTO LOG_BILL (LOG_DTE,BILL_NBR,BILL_NME,CREATE_DTE,MODIFY_DTE)
SELECT I.MODIFY_DTE, D.BILL_NBR, D.BILL_NME, D.CREATE_DTE, D.MODIFY_DTE FROM DELETED D
LEFT JOIN INSERTED I ON D.BILL_NBR = I.BILL_NBR
GO
INSERT INTO BILL
SELECT 'A',GETDATE(), GETDATE()
GO
UPDATE BILL SET BILL_NME='B' WHERE BILL_NBR=1
GO
SELECT * FROM LOG_BILL
触发器每语句触发一次,而不是每行触发一次。触发器可以访问插入的、删除的表,您可以根据需要使用这些表 插入后可以访问新插入的行,删除后可以访问已删除的行,更新后可以访问已删除的行以及新更新的行 请参见下面的简单示例
create table triggertest
(
id int,
name char(1)
)
create table log
(
id int,
name char(1),
operationdone char(2),
loggedtime datetime
)
Alter trigger trg_test1
on triggertest
after insert,update,delete
as
begin
set nocount on
--insert updated rows
if exists(select 1 from inserted) and exists(select 1 from deleted)
begin
insert into log
select *,'U',getdate() from inserted
return
end
----insert new rows
if exists(select 1 from inserted)
begin
insert into log
select *,'I',getdate() from inserted
return
end
--insertd deleted rows
if exists(select 1 from deleted)
begin
insert into log
select *,'D',getdate() from deleted
return
end
end
insert into triggertest
select 1,'z'
update triggertest
set
id=2
where name='z'
delete from triggertest
select * from log
select * from triggertest
id name operationdone loggedtime
1 z I 2016-03-08 19:54:23.617
2 z U 2016-03-08 19:54:30.373
2 z U 2016-03-08 19:54:30.373
2 z D 2016-03-08 19:54:39.063
2 z D 2016-03-08 19:54:39.063
下面是一个设置触发器以进行插入、更新和删除的示例
USE StackOverflow
GO
IF OBJECT_ID('dbo.tblAddress', 'U') IS NOT NULL
DROP TABLE dbo.tblAddress
CREATE TABLE tblAddress
(
Id INT IDENTITY PRIMARY KEY,
[Address] VARCHAR(128)
)
IF OBJECT_ID('dbo.tblAddressAudit', 'U') IS NOT NULL
DROP TABLE dbo.tblAddressAudit
CREATE TABLE tblAddressAudit
(
Id INT IDENTITY PRIMARY KEY,
AddressID INT,
[Address] VARCHAR(128),
AuditDate DATETIME,
[Action] CHAR(1)
)
IF OBJECT_ID('dbo.tblAddress_audit_trigger', 'U') IS NOT NULL
DROP TRIGGER dbo.tblAddress_audit_trigger
GO
CREATE TRIGGER dbo.tblAddress_audit_trigger
ON dbo.tblAddress
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS(SELECT 1 FROM deleted)
BEGIN
INSERT INTO dbo.tblAddressAudit
SELECT d.Id AS AddressID, d.[Address], GETDATE() AuditDate, 'D' [Action]
FROM deleted d
LEFT JOIN inserted i ON i.Id = d.Id
WHERE i.Id IS NULL
END
ELSE IF EXISTS(SELECT 1 FROM inserted)
BEGIN
INSERT INTO dbo.tblAddressAudit
SELECT i.Id AS AddressID, i.[Address], GETDATE() AuditDate, 'I' [Action]
FROM inserted i
LEFT JOIN deleted d ON i.Id = d.Id
WHERE d.Id IS NULL
END
IF EXISTS(SELECT 1 FROM inserted i JOIN deleted d on i.Id = d.Id)
BEGIN
INSERT INTO dbo.tblAddressAudit
SELECT i.Id AS AddressID, i.[Address], GETDATE() AuditDate, 'U' [Action]
FROM inserted i
JOIN deleted d on i.Id = d.Id
END
END
GO
INSERT INTO dbo.tblAddress
VALUES
(
'42 Goble street'
)
GO
UPDATE dbo.tblAddress
SET [Address] ='43 Goble St'
WHERE Id = 1
GO
DELETE FROM dbo.tblAddress
WHERE Id = 1
GO
@Lankymart FWICT可能重复OP希望将审核信息存储到特定的表中,而不是真正打印信息。看起来像是
之后的打字错误,在之后应该是之后,
@TT我不使用提供的代码。他们可能确实试图这样做,但如果他们通过传递PRINT
来测试它,那么想知道为什么这个问题不起作用会有帮助。它可能只是文本,但你的触发器已经不正确了。在SQL Server中,触发器在每条语句中触发一次,而不是每行触发一次。因此,当触发器触发时,它可能是对0、1或多行被删除、插入或更新的响应。感谢游戏ISWAR的帮助。谢谢你的帮助。