gpt4 book ai didi

tsql - 从插入触发器后调用存储过程

转载 作者:行者123 更新时间:2023-12-01 23:46:36 25 4
gpt4 key购买 nike

也许是个愚蠢的问题!

如果我从插入后触发器 (T-SQL) 调用存储过程 - 那么如何获取“刚刚插入”数据的值?例如

   CREATE TRIGGER dbo.MyTrigger
ON dbo.MyTable
AFTER INSERT
AS
BEGIN

EXEC createAuditSproc 'I NEED VALUES HERE!'

我不需要担心任何标识列 - 我只想使用一些“刚刚插入”的值传递到我的存储过程中。

编辑:为了澄清 - 我需要它来调用存储过程而不是直接插入表,因为存储过程执行不止一件事。我正在使用一些旧表,目前无法修改以“正确”执行操作(时间/资源/旧代码),所以我必须使用我所拥有的:(

最佳答案

您可以使用 INSERTED and DELETED 获取新“更改”的数据。伪表:

CREATE TRIGGER dbo.MyTrigger     
ON dbo.MyTable
AFTER INSERT
AS
BEGIN
INSERT INTO myTableAudit(ID, Name)
SELECT i.ID, i.Name
FROM inserted i;
END

给出示例表

create table myTable
(
ID INT identity(1,1),
Name varchar(10)
)
GO

create table myTableAudit
(
ID INT,
Name varchar(10),
TimeChanged datetime default CURRENT_TIMESTAMP
)
GO

编辑:抱歉,我没有解决有关调用存储过程的问题。根据 marc_s 的评论,请注意插入/删除可以包含多行,这使存储过程变得复杂。就我个人而言,我会让触发器直接插入审计表,而不封装 SPROC。但是,如果您有 SQL 2008,则可以使用表值参数,如下所示:

CREATE TYPE MyTableType AS TABLE
(
ID INT,
Name varchar(10)
);
GO

CREATE PROC dbo.MyAuditProc @MyTableTypeTVP MyTableType READONLY
AS
BEGIN
SET NOCOUNT ON;

INSERT INTO myTableAudit(ID, Name)
SELECT mtt.ID, mtt.Name
FROM @MyTableTypeTVP mtt;
END
GO

然后你的触发器将被更改如下:

ALTER TRIGGER dbo.MyTrigger
ON dbo.MyTable
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;

DECLARE @MyTableTypeTVP AS MyTableType;

INSERT INTO @MyTableTypeTVP(ID, Name)
SELECT i.ID, i.Name
FROM inserted i;

EXEC dbo.MyAuditProc @MyTableTypeTVP;
END

然后您可以测试这是否适用于单个和多个插入

insert into dbo.MyTable values ('single');

insert into dbo.MyTable
select 'double'
union
select 'insert';

但是,如果您使用的是 SQL 2005 或更低版本,您可能需要使用游标来循环插入传递行到 SPROC,这太可怕了,无法想象。

顺便说一句,如果您有 SQL 2008,您可能会查看 Change Data Capture

编辑#2:由于您需要调用过程,并且如果您确定只插入一行...

ALTER TRIGGER dbo.MyTrigger
ON dbo.MyTable
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;

DECLARE @SomeInt INT;
DECLARE @SomeName VARCHAR(10);

SELECT TOP 1 @SomeInt = i.ID, @SomeName = i.Name
FROM INSERTED i;

EXEC dbo.MyAuditProc @SomeInt, @SomeName;
END;

关于tsql - 从插入触发器后调用存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4887877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com