Pregunta

escribí un disparador que actualiza la tabla local y tabla similar en el servidor vinculado.

CREATE TRIGGER myTtableUpdate ON myTable
AFTER UPDATE AS
IF (COLUMNS_UPDATED() > 0)
BEGIN
DECLARE @retval int;
BEGIN TRY
EXEC @retval = sys.sp_testlinkedserver N'my_linked_server';
END TRY
BEGIN CATCH
SET @retval = sign(@@error);
END CATCH;

IF (@retval = 0)
BEGIN
UPDATE remoteTable SET remoteTable.datafield = i.datafield
FROM my_linked_server.remote_database.dbo.myTable remoteTable
INNER JOIN inserted i ON (remoteTable.id = i.id)
END
END -- end of trigger

Por desgracia, cuando la conexión se ha reducido recibo mensaje de error
'Msg 3616, nivel 16, estado 1, línea 2'
'Transacción condenados en el gatillo. Lote ha sido abortada '
y la fabricación local de actualización se deshace.

¿Hay una manera de mantener este error y mantener actualizaciones locales?
Tenga en cuenta que estoy usando SQL Server 2005 Express Edition en ambas PC con Windows XP Pro.

edit1: servidor SQL es Edición Express Hotel Edit2: Ambos ordenadores ejecutan Windows XP Pro por lo que estos no son los servidores

¿Fue útil?

Solución

No escribir en el servidor remoto en el gatillo.

  • crear una tabla local para almacenar filas que necesitan ser empujados al servidor remoto
  • insertar en esta nueva tabla local en el gatillo
  • crear un trabajo que se ejecuta cada N minutos para insertar de esta tabla local en el servidor remoto.

este trabajo se puede ejecutar un procedimiento que puede probar para la conexión, y cuando es una copia de seguridad, que se encargará de todas las filas de la nueva tabla local. Puede procesar las filas de la tabla local de esta manera:

declare @OutputTable table (RowID int not null)

insert into my_linked_server.remote_database.dbo.myTable remoteTable(...columns...)
    OUTPUT INSERTED.RowID
    INTO @OutputTable
    SELECT ...columns...
        from NewLocalTable

delete NewLocalTable
   from NewLocalTable           n
       inner join @OutputTable  o ON n.RowID=o.RowID

Editar comentario OP basada
después de la inserción en esta nueva tabla local iniciar el trabajo del gatillo (sp_start_job), se ejecutará en su propio ámbito. Si no puede utilizar los trabajos del servidor SQL, utilizar xp_cmdshell para ejecutar el procedimiento almacenado (SQLCMD de búsqueda o ISQL o OSQL, no estoy seguro de lo que tiene). Todavía programar el trabajo de cada N minutos, por lo que finalmente se ejecutará cuando la conexión aparece.

Otros consejos

es al menos uno de la edición servidores de grupo de trabajo o superior? Puede utilizar Service Broker para enviar sus registros en lugar de los servidores vinculados, pero no va a trabajar entre las ediciones para expresar debido a restricciones de licencia. Es una solución de confiar exclusivamente en SQL, ofrece fiabilidad en caso de incidentes (uno de los servidores no está disponible) y sus actualizaciones se propagan en tiempo real (tan pronto como están comprometidos). Mi sitio tiene muchos ejemplos de cómo hacer esto, se puede comenzar con este artículo aquí en cómo lograr un alto rendimiento mensaje.

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