2011-05-04 20 views
11

Tengo algunos problemas con linq-to-sql últimamente. El problema es que "piensa" que falla en las inserciones y actualizaciones cuando tenemos un activador asociado al evento. Un ejemplo podría ser una fila, donde se adjunta un disparador para establecer el "Último actualizador" de dos puntos a la hora actual, cuando se modifica una fila. Esto hará que linq-to-sql piense que ha fallado en la actualización o inserción, pero esto es solo algunas veces, ya que a veces ocurre, creo que es cuando el servidor sql está bajo una gran carga y por lo tanto no puede para ejecutar el disparador antes de que se realizara la validación, esto es solo especulación. Como mis scripts son solo una parte de un script mucho más grande, desactivar el disparador no es una opción, así que necesito encontrar una solución a esto o reescribir mi programa. ¿Alguno de ustedes ha experimentado este problema y ha encontrado una solución, por ejemplo, deshabilitar la validación después de las inserciones?Fallo de Linq a sql en la inserción y actualización cuando se trata de un disparador conectado

El gatillo.

USE [cnhha] 
GO 
/****** Object: Trigger [dbo].[LastUpdated] Script Date: 05/12/2011 16:26:51 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER TRIGGER [dbo].[LastUpdated] ON [dbo].[CN_User] 
FOR INSERT, UPDATE 
AS 

update cn_user set lastupdated=getdate() where campusnetuserid in (select campusnetuserid from inserted) 
+0

Es posible que tenga que desactivar el desencadenador en un entorno de prueba para verificar que ese sea realmente el problema. ¿Es posible eliminar los campos alterados por el activador de la instrucción LINQ2SQL para que no intente verificar? – n8wrl

+0

Qué tipo de desencadenador. Antes de la actualización o después de la actualización? –

+0

podría agregar lo que parece el gatillo por favor? – DForck42

Respuesta

7

Es probable que tenga SET NOCOUNT ON en su disparador

Excepto el caso estrecha (SQLDataAdapter) mencionado en mi question "SET NOCOUNT ON usage", se requiere de código más clientes

Puede quitar el gatillo demasiado si usted es capaz de cambiar su lado del cliente ACTUALIZAR para usar la palabra clave DEFAULT

update cn_user 
set col1 = this, col2 = that,..., 
    lastupdated= DEFAULT 
where ... 
+0

Aquí hay una buena información general. – arcain

2

¿Sus detonantes devuelven datos a través de SELECT declaraciones? Ver este artículo de MSDN: CREATE TRIGGER

Cuando un desencadenador se activa, los resultados son regresaron a la aplicación de llamada, al igual que con los procedimientos almacenados. Para eliminar la necesidad resultados devueltos a una aplicación debido a un disparo del gatillo , no incluyen seleccionar declaraciones que devuelven resultados, o instrucciones que realizan variables asignación en un disparador. Un disparador que incluye las sentencias SELECT que devuelven los resultados al usuario o las declaraciones que realizan la asignación de variable requiere un manejo especial; estos resultados devueltos tendrían que escribirse en en todas las aplicaciones en que están permitidas las modificaciones en la tabla de activación . Si la asignación de la variable debe ocurrir en un desencadenador, utilice una instrucción SET NOCOUNT en el al inicio del desencadenador para eliminar el retorno de cualquier conjunto de resultados.

Además, si cree que los desencadenadores están causando una gran carga en el motor de la base de datos, ¿ha considerado utilizar Service Broker para hacer que su postprocesamiento sea asincrónico?

Si pudiera incluir el código de un activador representativo, nos ayudaría a seguir diagnosticando el problema que está experimentando.

+0

El activador no tiene selección, y la dosis no devuelve ninguna fecha. ¡He agregado el código para el disparador en cuestión en mi primera publicación! – Androme

0

Puede tomar la ayuda del generador de perfiles SQL para todas las actividades que suceden durante el proceso. Puede capturar y guardar datos sobre cada evento en un archivo o tabla.

+0

Hemos intentado utilizar un generador de perfiles SQL, y todos los comandos que linq-to-sql envía a la base de datos funcionan sin problemas. Es solo el linq-to-sql el que piensa que falló – Androme

0

Si con la actualización del activador el valor de propiedad detrás de la parte posterior de su código está jugando con la lógica de validación de entidad personalizada, ¿puede evitar el activador y establecer directamente la propiedad LastUpdated en la entidad, o no realizar ninguna validación (que no sea validación de esquema) sobre el valor de la propiedad LastUpdated?

Cuestiones relacionadas