Cómo determinar en un disparador insertos directos e insertos a través de procedimiento almacenado

dba.stackexchange https://dba.stackexchange.com/questions/3816

  •  16-10-2019
  •  | 
  •  

Pregunta

Tablex puede ser modificado de dos maneras:

  • cliente hace insertos "directos"
  • cliente utiliza procedimiento almacenado para inserta registros

Cómo determinar el modo de llamada de cliente (proc directa o almacenado) en un disparador de TABLEX

Gracias.

¿Fue útil?

Solución

SET CONTEXT_INFO en el procedimiento almacenado y lo leyó en el gatillo con CONTEXT_INFO ()

Haga que el gatillo se restablece en la salida.

Otros consejos

Usted no puede determinarla. Todo lo que tiene a su disposición es las tablas inserted y deleted. Probablemente se podría hacer trampa, pero es un truco gawdawful, sangrienta. Definir una vista con una columna de "extra", lo que es no importa. Toda su inserción proc / actualización de asignación de valor de uno a esa columna, actualizaciones directas suministrar un (valor o inexistente) diferente. Crear un lugar de gatillo en ese punto de vista y luego hacer su lógica de actualización basado en la bandera fuente

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

Así que es una solución, pero realmente, ¿cuál es el problema que está tratando de resolver? ¿Por qué te importa si la LMD proviene de proc proc o no?

Sugiero que se inicia una sesión de seguimiento sobre las declaraciones que toque (hacer inserto acciones) TABLEX y ver alguna información específica como nombre de host, loginame, ProgramName.

Lo más probable es que los insertos manuales se pueden hacer desde Management Studio usando su nombre de usuario y su estación, mientras que las inserciones de procedimiento almacenado se llevará a cabo a partir de una aplicación específica, utilizando un usuario de la aplicación y que el nombre del programa. Si ve algún patrón constante que le ayudará a descubrir las diferencias entre las acciones, de lo que será capaz de utilizar la siguiente consulta de ejemplo para guardar datos en una tabla de registro:

select sp.hostname, sp.program_name, sp.loginame
from sysprocesses sp
where spid = @@spid

Esa solución (o el anterior sugiere billinkc) sólo si no se puede alterar los procedimientos almacenados. Si puede hacer eso, lo que debería ser fácil de añadir la parte de registro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top