Cómo determinar en un disparador insertos directos e insertos a través de procedimiento almacenado
-
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.
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.