代码之家  ›  专栏  ›  技术社区  ›  Mike Clark

确定存储过程或触发器中的调用方

  •  1
  • Mike Clark  · 技术社区  · 14 年前

    我正在使用Sybase数据库中的插入触发器。我知道我可以访问@nestlevel来确定我是被直接调用还是被另一个触发器或过程调用。

    例如,表是直接插入到的吗?它是由另一个触发器插入的吗?如果是,是哪个触发器插入的。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Community George Stocker    7 年前

    据我所知,这是不可能的。最好将其作为参数包含到存储过程中。如前所述 here ,这也将使您的代码更易于移植,因为使用的任何方法都可能依赖于特定于数据库的调用。这里的链接是针对SQLServer2005的,不是针对Sybase的,但我认为你们基本上是站在同一条船上的。

        2
  •  0
  •   Mr.Mindor    14 年前

    declare @parent_proc_id int
    if @@nestlevel > 1
    begin
    
       create table #temp_parent_proc (
        procId int,
        nestLevel int,
        contextId int
       )
       insert into #temp_parent_proc
        select  mss.ProcedureID,
                mss.ProcNestLevel,
                mss.ContextID
        from monSysStatement mss 
        join monProcessStatement mps
            on mss.KPID = mps.KPID
            and mss.BatchID = mps.BatchID
            and mss.SPID = mps.SPID
        where mps.ProcedureID =@@procid
            and mps.SPID = @@spid
    
        select @parent_proc_id = (select tpp.procId
                    from #temp_parent_proc tpp,
                         #temp_parent_proc2 tpp2
                    where tpp.nestLevel = tpp2.nestLevel-1
                      and tpp.contextId < tpp2.contextId
                      and tpp2.procId = @@procid
                      and tpp2.nestLevel = @@nestlevel
                    group by tpp.procId, tpp.contextId
                    having tpp.contextId = max(tpp.contextId ))
    
        drop table #temp_parent_proc
    end
    

    由于monProcessStatement和monSysStatement的性质,temp表是必需的。 monProcessStatement是暂时的,因此如果您多次引用它,它可能不再包含相同的行。 monSysStatement是一个历史表,保证只向访问它的任何进程返回一次单个行。

    如果这也不是一个选项,因为您无法将参数传递到触发器中,那么另一种可能的解决方法是使用临时表。

    create table #trigger_parent (proc_id int)
    insert into #trigger_parent @@procid
    

    然后在触发器中,临时表将可用。。。

    if object_id('#trigger_parent') is not null 
        set @parent_proc = select l proc_id from #trigger_parent
    

    你会知道它是从另一个进程中触发的。

    问题是它不“只是工作”。必须强制执行临时表设置。