如何在触发器中获取sql语句

Posted

技术标签:

【中文标题】如何在触发器中获取sql语句【英文标题】:How to get sql statement in trigger 【发布时间】:2012-11-26 14:35:04 【问题描述】:

我对每个表都有插入、更新、删除触发器来记录操作。 我正在从删除、插入并将这些数据包装到 xml 之前和之后检索数据。 但有些日志无法显示之前和更新值。 我的sql语句是:

USE [cop]

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[Delete]   ON  [dbo].[Seanslar]   
    AFTER DELETE 
AS 
BEGIN 

SET NOCOUNT ON 

DECLARE @deleted AS XML 
SET @deleted = (select * from deleted for xml AUTO, ELEMENTS XSINIL)

DECLARE @logIslem TINYINT 
SET @logIslem = 3 

DECLARE @tableName VARCHAR(200) 
SELECT @tableName = OBJECT_SCHEMA_NAME( parent_id ) + '.' + OBJECT_NAME( parent_id ) 
  FROM sys.triggers 
 WHERE object_id = @@PROCID  

DECLARE @xmlToChar NVARCHAR(MAX)
SET @xmlToChar = CAST(@deleted AS nvarchar(MAX))

IF LEN(@xmlToChar)<10 
BEGIN 
    IF EXISTS(select * from deleted)
        select @xmlToChar = CAST(seans_id AS NVARCHAR(MAX)) from deleted
    ELSE
        SET @xmlToChar = 'Deleted is empty!'
END

DECLARE @allXml AS XML  
SET @allXml = '<'+@tableName+'>'+ @xmlToChar +'</'+@tableName+'>'  

INSERT INTO [dbo].[Logla]
    ([logIslem], [trgKullanici_id], [tabloAdi], [logXml])     
VALUES           
    (@logIslem, SUSER_NAME(), @tableName, @allXml)

  END

有什么方法可以学习在触发器中执行的“sql语句”吗?

【问题讨论】:

【参考方案1】:

没有实用的方法来捕获由该语句触发的 DML 触发器中正在执行的 SQL 语句文本。

您可以使用 DDL(元数据)触发器执行此操作,但不能使用 DML(普通)触发器。


是的,有一两种非常不切实际的方法可以做到这一点,但我真的不推荐它们,除非:

    您非常非常精通 SQL,并且 你真的,真的需要得到它,并且 您可以负担大量的开发和测试时间

【讨论】:

以上是关于如何在触发器中获取sql语句的主要内容,如果未能解决你的问题,请参考以下文章

如何调整oracle中的sql语句输入的最大长度

如何在 PL/SQL 中编写语句级触发器

PL/PGSQL触发器如何检测UPDATE上的SQL语句中是不是提供了列?

如何用delphi执行SQL语句,创建触发器,我曾用ADOCommond,但他无法识别‘go’

语句触发器 PL/SQL

如何获得应用了触发器更新的 SQL 数据更改语句的结果?