代码之家  ›  专栏  ›  技术社区  ›  hacker

通过表触发器捕获存储过程参数

  •  4
  • hacker  · 技术社区  · 15 年前

    我有一个表,它有一个与之相关联的触发器,用于更新、插入和删除。触发器工作正常并执行。这是我的触发器代码:

    CREATE trigger [dbo].[trg_audit_TableName]
    ON [dbo].viewLayers
    FOR INSERT, UPDATE, DELETE
    AS
    SET NOCOUNT ON
    declare @inputbuffer table (EventType nvarchar(30),Parameters int,EventInfo nvarchar(4000))
    insert into @inputbuffer exec('dbcc inputbuffer('+@@Spid+')')
    declare @ins int
    declare @del int
    select @ins = count(*) from inserted
    select @del = count(*) from deleted
    
    insert into audit_TableName (eventtime, CurrentMachine, appName,  CurrentUser, eventtype, tsql)
    select getdate(), host_name(), APP_NAME(), suser_sname(), 
        case 
            when isnull(@ins, 0) > 0 and isnull(@del, 0) > 0 then 'update' 
            when isnull(@ins, 0) > 0 and isnull(@del, 0) = 0 then 'insert' 
            else 'delete' 
        end, 
        EventInfo
    from @inputbuffer
    

    现在,如果我从ManagementStudio运行存储过程,则插入到表中的TSWL数据如下所示:

    sp_TestInsert 'paramdata 1', 'paramdata 2'
    

    但是,如果使用sqlcommand对象从.NET应用程序运行该过程,则tsql字段不会显示参数:

    sp_TestInsert;1
    

    如果在从.NET执行此存储过程时打开该过程的探查器,我会看到:

    exec sp_TestInsert @val1='paramdata 1',@val2='paramdata 2' 
    

    然而,审计表仍然显示

    SPTestTestCube;1
    

    有没有一种方法可以检索与存储过程一起传递的参数?

    编辑: 根据存储过程的不同,它将在具有触发器的表中插入/更新/删除数据

    编辑2: 下面是一个非常简单的.NET执行示例(“conn”是我的sqlconnection对象):

    Using cmd As SqlCommand = conn.CreateCommand 
         cmd.CommandType = CommandType.StoredProcedure 
         cmd.CommandText = "sp_TestInsert" 
         cmd.Parameters.AddWithValue("@val1", "paramdata 1")
         cmd.Parameters.AddWithValue("@val2", "paramdata 2") 
         cmd.ExecuteNonQuery() 
     End Using
    
    2 回复  |  直到 15 年前
        1
  •  0
  •   kemiller2002    15 年前

    这是在执行没有参数的存储过程。分号表示SQL中的语句结束。

    SPTestTestCube;1

    我想这就是你要找的

    SPT测试插入1

    这是假设“sp_esteinsert;1”是从代码传递到SQL Server的代码。

        2
  •  0
  •   hacker    15 年前

    我最后修改了触发器,将插入/删除的数据也包括在内,如下所示:

     declare @insData varchar(max)  
     set @insData = (select * from inserted for xml auto)  
     declare @delData varchar(max)  
     set @delData = (select * from deleted for xml auto)  
    

    然后将@insdata和@deldata插入到审计表中。这现在显示了所做的更改。