Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在另一个表中插入SQL Server触发器信息_Sql Server_Triggers - Fatal编程技术网

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
,我想使用触发器。当I
INSERT/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的帮助。谢谢你的帮助。