如何在触发器中确定直接插入和通过存储过程插入

gar*_*rik 3 trigger sql-server-2008

TableX 可以通过两种方式修改:

  • 客户执行“直接”插入
  • 客户端使用存储过程插入记录

如何在tableX的触发器中确定客户端的调用方式(直接或存储过程)

谢谢你。

bil*_*nkc 5

你无法确定。您可以使用的只是 INSERTED 和 DELETED 表。你可能会作弊,但这是一个令人眼花缭乱的血腥黑客。定义一个带有“额外”列的视图,它是什么并不重要。您所有的 proc 插入/更新都为该列分配一个值,直接更新提供不同的(或不存在的值)。在该视图上创建一个而不是触发器,然后根据源标志执行更新逻辑

CREATE VIEW dbo.vwTableX
AS
SELECT
    X.*
,   'T' AS fake_source_column
FROM
    dbo.tableX X

GO
CREATE TRIGGER insertHack ON dbo.vwTableX
INSTEAD OF INSERT
AS
BEGIN

    SET NOCOUNT ON

    IF EXISTS (SELECT * FROM INSERTED I WHERE I.fake_source_column = 'P')
    BEGIN
        -- perform logic for PROC sourced data
        INSERT INTO
            dbo.tableX
        SELECT
            I.col1
        ,   I.col2
        -- everything but our fake column
        FROM
            INSERTED I
        WHERE
            I.fake_source_column = 'P'
    END

    IF EXISTS (SELECT * FROM INSERTED I WHERE I.fake_source_column = 'D' OR I.fake_source_columns IS NULL)
    BEGIN
        -- perform logic for direct access data
        INSERT INTO
            dbo.tableX
        SELECT
            I.col1 * 2 -- or whatever special logic you wish to apply
        ,   I.col2
        -- everything but our fake column 
        FROM
            INSERTED I
        WHERE
            I.fake_source_column = 'D' OR I.fake_source_columns IS NULL
    END
END
GO

-- lather, rinse, repeat for update and/or delete trigger
Run Code Online (Sandbox Code Playgroud)

所以这是一个解决方案,但实际上,您要解决的问题是什么?你为什么关心 DML 是来自 proc 还是非 proc?