¿Cómo cambio un campo en un trigger INSERT?

24/09/2004 - 14:16 por Horacio | Informe spam
Hola!
Ya estudié lo de linked servers y triggers, como
anteriormente me indicaron, para resolver mi problema.
Pero ahora me encuentro con otro.
Necesito poner la fecha actual en un campo(el último) al
momento que se produce la inserción. ¿Cómo lo consigo?

Aqui esta lo que intenté hacer sin éxito:
CREATE TRIGGER Correos_insert
ON correos
FOR INSERT
AS
BEGIN TRANSACTION inserta
INSERT INTO SSBUETYGSM01.Gasmed.dbo.Correos
(dsRemitente, dsRemitenteNombre, dsDestinatario,
dsDestinatarioNombre, dsDestinatarioCC, dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion)
SELECT dsRemitente, dsRemitenteNombre, dsDestinatario,
dsDestinatarioNombre, dsDestinatarioCC, dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion
FROM inserted

IF @@ERROR <> 0
GOTO ErrorCode

insert into correos (dsRemitente, dsRemitenteNombre,
dsDestinatario, dsDestinatarioNombre, dsDestinatarioCC,
dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion, dtEnvio)
select dsRemitente, dsRemitenteNombre, dsDestinatario,
dsDestinatarioNombre, dsDestinatarioCC, dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion, getdate()
from inserted


COMMIT TRANSACTION inserta

ErrorCode:
IF @@TRANCOUNT <> 0
PRINT 'Error Code'

Preguntas similare

Leer las respuestas

#6 Horacio
24/09/2004 - 17:10 | Informe spam
Hola liliana!
Te cuento:
Los registros en la tabla correos llegan despues de que se
llámó al SP spCorreosEncolar (ahora estoy intentando
olvidarme del trigger y hacer todo desde aqui, pero
surgieron otras cosas). Este sp hace el insert en la tabla
correos.
Mi intención era que la fecha de envio se cargue SOLO
cuando se halla podido enviar a la tabla correos del
Linked Server, en caso de que no halla conexion no quiero
que se establezca la fecha de envío.
Bueno, borré el trigger. Y en el sp spCorreos encolar que
hacía el insert traté de hacer el insert directamente en
el linked server (despues de toparme con un BUG:
http://support.microsoft.com/defaul...cid=kb;en-
us;296769)
Pero para mi sorpresa me tira el mismo error!!!
Transcribo:
Error:Unable to start a nested transaction for OLE DB
provider 'SQLOLEDB'. A nested transaction was required
because the XACT_ABORT option was set to OFF. OLE DB error
trace [OLE/DB Provider 'SQLOLEDB'
ITransactionLocal::StartTransaction returned 0x8004d013:
]. [OLE/DB provider returned message: Cannot
start more transactions on this session.] (TrEjecutar:
Microsoft OLE DB Provider for SQL Server).

Juro que borré el trigger!
este es el spCorreosEnclar modificado:

REATE PROCEDURE dbo.spCorreosEncolar (
@dsRemitente AS VARCHAR(100),
@dsRemitenteNombre AS VARCHAR(100),
@dsDestinatario AS VARCHAR(1000),
@dsDestinatarioNombre AS VARCHAR(100),
@dsDestinatarioCC AS VARCHAR(1000),
@dsDestinatarioCCO AS VARCHAR(1000),
@dsResponderA AS VARCHAR(100),
@dsAsunto AS VARCHAR(200),
@dsTipo AS VARCHAR(50),
@dsMensaje AS VARCHAR(8000),
@dsMensajeArchivo AS VARCHAR(1000),
@dsAdjuntos AS VARCHAR(1000)) AS
/**********************************************************
************************
Encola los mails a ser enviados.
***********************************************************
***********************/
remitente del correo. (Obligatorio)
(NULO si no se especifica)
destinatario del correo. (Separados por coma si son
varios) (Obligatorio)
no se especifica)
destinatario en copia del correo. (Separados por coma si
son varios) (NULO si no se especifica)
destinatario en copia oculta del correo. (Separados por
coma si son varios) (NULO si no se especifica)
responderá el correo. (NULO si coincide con la dirección
del remitente del correo)
(Obligatorio)
mensaje [text/plain;text/html]. (NULO equivale a
text/plain)
(Obligatorio)
incluído en el mensaje del correo. (NULO si no se
especifica)
adjunto al correo (Separados por punto y coma si son
varios) (NULO si no se especifica)
IF @dsResponderA IS NULL
SET @dsResponderA = @dsRemitente
IF @dsTipo IS NULL
SET @dsTipo = 'text/plain'
/*
INSERT INTO Correos (dsRemitente, dsRemitenteNombre,
dsDestinatario, dsDestinatarioNombre, dsDestinatarioCC,
dsDestinatarioCCO, dsResponderA, dsAsunto, dsTipo,
dsMensaje, dsMensajeArchivo, dsAdjuntos)
VALUES (@dsRemitente, @dsRemitenteNombre, @dsDestinatario,
@dsDestinatarioNombre, @dsDestinatarioCC,
@dsDestinatarioCCO, @dsResponderA, @dsAsunto, @dsTipo,
@dsMensaje, @dsMensajeArchivo, @dsAdjuntos)

*/
INSERT INTO SSBUETYGSM01.Gasmed.dbo.Correos
(dsRemitente, dsRemitenteNombre, dsDestinatario,
dsDestinatarioNombre, dsDestinatarioCC, dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos)
VALUES (@dsRemitente, @dsRemitenteNombre, @dsDestinatario,
@dsDestinatarioNombre, @dsDestinatarioCC,
@dsDestinatarioCCO, @dsResponderA, @dsAsunto, @dsTipo,
@dsMensaje, @dsMensajeArchivo, @dsAdjuntos)

IF @@ERROR <> 0
begin
INSERT INTO correos (dsRemitente,
dsRemitenteNombre, dsDestinatario, dsDestinatarioNombre,
dsDestinatarioCC, dsDestinatarioCCO, dsResponderA,
dsAsunto, dsTipo, dsMensaje, dsMensajeArchivo, dsAdjuntos)
VALUES (@dsRemitente, @dsRemitenteNombre,
@dsDestinatario, @dsDestinatarioNombre, @dsDestinatarioCC,
@dsDestinatarioCCO, @dsResponderA, @dsAsunto, @dsTipo,
@dsMensaje, @dsMensajeArchivo, @dsAdjuntos)
end
GO



Hola Horacio,

No entiendo porqué no hacer el insert en la tabla Correo


con el getdate() de
entrada, eso disparará el trigger que hará el insert en
SSBUETYGSM01.Gasmed.dbo.Correos, y nada más.
Lo que está haciendo en forma anidada es invocar al


trigger porque dentro de
él estás haciendo otro insert, que invocará al


trigger. y así.

Saludos, Liliana.

"Horacio" escribió


en el mensaje
news:300001c4a23f$a8122fa0$
Cuando hago un insert me tira el error que dice que esta
haciendo algo en forma anidada, que nose pueden hacer mas
transacciones para esa sesion.
Para evitar eso le agregué al final del select
where dtEnvio is null
para que no se repita, pero sigue tirando el mismo error.
Transcribo el mensaje:

Cannot start mor transactions on this session. Unable to
start a nested transaction for OLE DB provider. A nested
transaction was required because the XACT_ABORT option was
set to OFF.



tenes razon, debe ser porque es viernes ;-)

mmm eso deberia funcionar bien, si usas el Getdate(). Vos


decis que no esta
insertando el campo fecha?


Salu2





-
-
Maxi
Buenos Aires - Argentina
Desarrollador Microsoft 3 Estrellas .NET





-
-
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Horacio" escribió


en el mensaje
news:22d001c4a236$2f0b9b40$
Hola Maxi!
Fijate bien, el getdate está en el select!
El problema es que se está haciendo algo en forma
recursiva, no? Cómo lo puedo evitar? o cual es la forma
correcta de modificar un dato en el momento de la
inserción?

Gracias!

HRC


Hola, el Getdate() va en el Select y no en la lista de


campos!! sino tambien
podes poner un Default en el campo


Salu2






-
-
-
Maxi
Buenos Aires - Argentina
Desarrollador Microsoft 3 Estrellas .NET






-
-
-
Nunca consideres el estudio como una obligación sino






como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Horacio" escribió


en el mensaje
news:2f0701c4a230$572a33d0$
Hola!
Ya estudié lo de linked servers y triggers, como
anteriormente me indicaron, para resolver mi problema.
Pero ahora me encuentro con otro.
Necesito poner la fecha actual en un campo(el último) al
momento que se produce la inserción. ¿Cómo lo consigo?

Aqui esta lo que intenté hacer sin éxito:
CREATE TRIGGER Correos_insert
ON correos
FOR INSERT
AS
BEGIN TRANSACTION inserta
INSERT INTO SSBUETYGSM01.Gasmed.dbo.Correos
(dsRemitente, dsRemitenteNombre, dsDestinatario,
dsDestinatarioNombre, dsDestinatarioCC,




dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion)
SELECT dsRemitente, dsRemitenteNombre, dsDestinatario,
dsDestinatarioNombre, dsDestinatarioCC,




dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion
FROM inserted

IF @@ERROR <> 0
GOTO ErrorCode

insert into correos (dsRemitente, dsRemitenteNombre,
dsDestinatario, dsDestinatarioNombre, dsDestinatarioCC,
dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion, dtEnvio)
select dsRemitente, dsRemitenteNombre, dsDestinatario,
dsDestinatarioNombre, dsDestinatarioCC,




dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion, getdate()
from inserted


COMMIT TRANSACTION inserta

ErrorCode:
IF @@TRANCOUNT <> 0
PRINT 'Error Code'





Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system




(http://www.grisoft.com).
Version: 6.0.764 / Virus Database: 511 - Release Date:


15/09/2004


.






Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system




(http://www.grisoft.com).
Version: 6.0.764 / Virus Database: 511 - Release Date:


15/09/2004


.





.

Respuesta Responder a este mensaje
#7 Liliana Sorrentino
24/09/2004 - 18:07 | Informe spam
Horacio,
Por las dudas ¿no tendrás un trigger en la tabla del linked server?
Fijate además que después del Insert, estás insertando en la segunda tabla
si @@error es distinto de cero, o sea, si hay error.

Liliana.

"Horacio" escribió en el mensaje
news:30ce01c4a248$95aa0870$
Hola liliana!
Te cuento:
Los registros en la tabla correos llegan despues de que se
llámó al SP spCorreosEncolar (ahora estoy intentando
olvidarme del trigger y hacer todo desde aqui, pero
surgieron otras cosas). Este sp hace el insert en la tabla
correos.
Mi intención era que la fecha de envio se cargue SOLO
cuando se halla podido enviar a la tabla correos del
Linked Server, en caso de que no halla conexion no quiero
que se establezca la fecha de envío.
Bueno, borré el trigger. Y en el sp spCorreos encolar que
hacía el insert traté de hacer el insert directamente en
el linked server (despues de toparme con un BUG:
http://support.microsoft.com/defaul...cid=kb;en-
us;296769)
Pero para mi sorpresa me tira el mismo error!!!
Transcribo:
Error:Unable to start a nested transaction for OLE DB
provider 'SQLOLEDB'. A nested transaction was required
because the XACT_ABORT option was set to OFF. OLE DB error
trace [OLE/DB Provider 'SQLOLEDB'
ITransactionLocal::StartTransaction returned 0x8004d013:
]. [OLE/DB provider returned message: Cannot
start more transactions on this session.] (TrEjecutar:
Microsoft OLE DB Provider for SQL Server).

Juro que borré el trigger!
este es el spCorreosEnclar modificado:

REATE PROCEDURE dbo.spCorreosEncolar (
@dsRemitente AS VARCHAR(100),
@dsRemitenteNombre AS VARCHAR(100),
@dsDestinatario AS VARCHAR(1000),
@dsDestinatarioNombre AS VARCHAR(100),
@dsDestinatarioCC AS VARCHAR(1000),
@dsDestinatarioCCO AS VARCHAR(1000),
@dsResponderA AS VARCHAR(100),
@dsAsunto AS VARCHAR(200),
@dsTipo AS VARCHAR(50),
@dsMensaje AS VARCHAR(8000),
@dsMensajeArchivo AS VARCHAR(1000),
@dsAdjuntos AS VARCHAR(1000)) AS
/**********************************************************
************************
Encola los mails a ser enviados.
***********************************************************
***********************/
remitente del correo. (Obligatorio)
(NULO si no se especifica)
destinatario del correo. (Separados por coma si son
varios) (Obligatorio)
no se especifica)
destinatario en copia del correo. (Separados por coma si
son varios) (NULO si no se especifica)
destinatario en copia oculta del correo. (Separados por
coma si son varios) (NULO si no se especifica)
responderá el correo. (NULO si coincide con la dirección
del remitente del correo)
(Obligatorio)
mensaje [text/plain;text/html]. (NULO equivale a
text/plain)
(Obligatorio)
incluído en el mensaje del correo. (NULO si no se
especifica)
adjunto al correo (Separados por punto y coma si son
varios) (NULO si no se especifica)
IF @dsResponderA IS NULL
SET @dsResponderA = @dsRemitente
IF @dsTipo IS NULL
SET @dsTipo = 'text/plain'
/*
INSERT INTO Correos (dsRemitente, dsRemitenteNombre,
dsDestinatario, dsDestinatarioNombre, dsDestinatarioCC,
dsDestinatarioCCO, dsResponderA, dsAsunto, dsTipo,
dsMensaje, dsMensajeArchivo, dsAdjuntos)
VALUES (@dsRemitente, @dsRemitenteNombre, @dsDestinatario,
@dsDestinatarioNombre, @dsDestinatarioCC,
@dsDestinatarioCCO, @dsResponderA, @dsAsunto, @dsTipo,
@dsMensaje, @dsMensajeArchivo, @dsAdjuntos)

*/
INSERT INTO SSBUETYGSM01.Gasmed.dbo.Correos
(dsRemitente, dsRemitenteNombre, dsDestinatario,
dsDestinatarioNombre, dsDestinatarioCC, dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos)
VALUES (@dsRemitente, @dsRemitenteNombre, @dsDestinatario,
@dsDestinatarioNombre, @dsDestinatarioCC,
@dsDestinatarioCCO, @dsResponderA, @dsAsunto, @dsTipo,
@dsMensaje, @dsMensajeArchivo, @dsAdjuntos)

IF @@ERROR <> 0
begin
INSERT INTO correos (dsRemitente,
dsRemitenteNombre, dsDestinatario, dsDestinatarioNombre,
dsDestinatarioCC, dsDestinatarioCCO, dsResponderA,
dsAsunto, dsTipo, dsMensaje, dsMensajeArchivo, dsAdjuntos)
VALUES (@dsRemitente, @dsRemitenteNombre,
@dsDestinatario, @dsDestinatarioNombre, @dsDestinatarioCC,
@dsDestinatarioCCO, @dsResponderA, @dsAsunto, @dsTipo,
@dsMensaje, @dsMensajeArchivo, @dsAdjuntos)
end
GO



Hola Horacio,

No entiendo porqué no hacer el insert en la tabla Correo


con el getdate() de
entrada, eso disparará el trigger que hará el insert en
SSBUETYGSM01.Gasmed.dbo.Correos, y nada más.
Lo que está haciendo en forma anidada es invocar al


trigger porque dentro de
él estás haciendo otro insert, que invocará al


trigger. y así.

Saludos, Liliana.

"Horacio" escribió


en el mensaje
news:300001c4a23f$a8122fa0$
Cuando hago un insert me tira el error que dice que esta
haciendo algo en forma anidada, que nose pueden hacer mas
transacciones para esa sesion.
Para evitar eso le agregué al final del select
where dtEnvio is null
para que no se repita, pero sigue tirando el mismo error.
Transcribo el mensaje:

Cannot start mor transactions on this session. Unable to
start a nested transaction for OLE DB provider. A nested
transaction was required because the XACT_ABORT option was
set to OFF.



tenes razon, debe ser porque es viernes ;-)

mmm eso deberia funcionar bien, si usas el Getdate(). Vos


decis que no esta
insertando el campo fecha?


Salu2





-
-
Maxi
Buenos Aires - Argentina
Desarrollador Microsoft 3 Estrellas .NET





-
-
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Horacio" escribió


en el mensaje
news:22d001c4a236$2f0b9b40$
Hola Maxi!
Fijate bien, el getdate está en el select!
El problema es que se está haciendo algo en forma
recursiva, no? Cómo lo puedo evitar? o cual es la forma
correcta de modificar un dato en el momento de la
inserción?

Gracias!

HRC


Hola, el Getdate() va en el Select y no en la lista de


campos!! sino tambien
podes poner un Default en el campo


Salu2






-
-
-
Maxi
Buenos Aires - Argentina
Desarrollador Microsoft 3 Estrellas .NET






-
-
-
Nunca consideres el estudio como una obligación sino






como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Horacio" escribió


en el mensaje
news:2f0701c4a230$572a33d0$
Hola!
Ya estudié lo de linked servers y triggers, como
anteriormente me indicaron, para resolver mi problema.
Pero ahora me encuentro con otro.
Necesito poner la fecha actual en un campo(el último) al
momento que se produce la inserción. ¿Cómo lo consigo?

Aqui esta lo que intenté hacer sin éxito:
CREATE TRIGGER Correos_insert
ON correos
FOR INSERT
AS
BEGIN TRANSACTION inserta
INSERT INTO SSBUETYGSM01.Gasmed.dbo.Correos
(dsRemitente, dsRemitenteNombre, dsDestinatario,
dsDestinatarioNombre, dsDestinatarioCC,




dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion)
SELECT dsRemitente, dsRemitenteNombre, dsDestinatario,
dsDestinatarioNombre, dsDestinatarioCC,




dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion
FROM inserted

IF @@ERROR <> 0
GOTO ErrorCode

insert into correos (dsRemitente, dsRemitenteNombre,
dsDestinatario, dsDestinatarioNombre, dsDestinatarioCC,
dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion, dtEnvio)
select dsRemitente, dsRemitenteNombre, dsDestinatario,
dsDestinatarioNombre, dsDestinatarioCC,




dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion, getdate()
from inserted


COMMIT TRANSACTION inserta

ErrorCode:
IF @@TRANCOUNT <> 0
PRINT 'Error Code'





Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system




(http://www.grisoft.com).
Version: 6.0.764 / Virus Database: 511 - Release Date:


15/09/2004


.






Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system




(http://www.grisoft.com).
Version: 6.0.764 / Virus Database: 511 - Release Date:


15/09/2004


.





.

Respuesta Responder a este mensaje
#8 Horacio
24/09/2004 - 18:54 | Informe spam
En la "remota" no hay triggers y en la "local" tampoco, el
que hice lo borré.
El tema sería insertar en la remota y si hay error dejarlo
en la local para poder detectar que hubo error y no perder
el correo que se quiso enviar.

¿Me estará faltando algo para poder usar el linked
server "remoto"?

Gracias
Horacio,
Por las dudas ¿no tendrás un trigger en la tabla del


linked server?
Fijate además que después del Insert, estás insertando en


la segunda tabla
si @@error es distinto de cero, o sea, si hay error.

Liliana.

"Horacio" escribió


en el mensaje
news:30ce01c4a248$95aa0870$
Hola liliana!
Te cuento:
Los registros en la tabla correos llegan despues de que se
llámó al SP spCorreosEncolar (ahora estoy intentando
olvidarme del trigger y hacer todo desde aqui, pero
surgieron otras cosas). Este sp hace el insert en la tabla
correos.
Mi intención era que la fecha de envio se cargue SOLO
cuando se halla podido enviar a la tabla correos del
Linked Server, en caso de que no halla conexion no quiero
que se establezca la fecha de envío.
Bueno, borré el trigger. Y en el sp spCorreos encolar que
hacía el insert traté de hacer el insert directamente en
el linked server (despues de toparme con un BUG:
http://support.microsoft.com/defaul...cid=kb;en-
us;296769)
Pero para mi sorpresa me tira el mismo error!!!
Transcribo:
Error:Unable to start a nested transaction for OLE DB
provider 'SQLOLEDB'. A nested transaction was required
because the XACT_ABORT option was set to OFF. OLE DB error
trace [OLE/DB Provider 'SQLOLEDB'
ITransactionLocal::StartTransaction returned 0x8004d013:
]. [OLE/DB provider returned message: Cannot
start more transactions on this session.] (TrEjecutar:
Microsoft OLE DB Provider for SQL Server).

Juro que borré el trigger!
este es el spCorreosEnclar modificado:

REATE PROCEDURE dbo.spCorreosEncolar (
@dsRemitente AS VARCHAR(100),
@dsRemitenteNombre AS VARCHAR(100),
@dsDestinatario AS VARCHAR(1000),
@dsDestinatarioNombre AS VARCHAR(100),
@dsDestinatarioCC AS VARCHAR(1000),
@dsDestinatarioCCO AS VARCHAR(1000),
@dsResponderA AS VARCHAR(100),
@dsAsunto AS VARCHAR(200),
@dsTipo AS VARCHAR(50),
@dsMensaje AS VARCHAR(8000),
@dsMensajeArchivo AS VARCHAR(1000),
@dsAdjuntos AS VARCHAR(1000)) AS
/*********************************************************


*
************************
Encola los mails a ser enviados.
**********************************************************


*
***********************/
remitente del correo. (Obligatorio)
(NULO si no se especifica)
destinatario del correo. (Separados por coma si son
varios) (Obligatorio)
no se especifica)
destinatario en copia del correo. (Separados por coma si
son varios) (NULO si no se especifica)
destinatario en copia oculta del correo. (Separados por
coma si son varios) (NULO si no se especifica)
responderá el correo. (NULO si coincide con la dirección
del remitente del correo)
(Obligatorio)
mensaje [text/plain;text/html]. (NULO equivale a
text/plain)
(Obligatorio)
incluído en el mensaje del correo. (NULO si no se
especifica)
adjunto al correo (Separados por punto y coma si son
varios) (NULO si no se especifica)
IF @dsResponderA IS NULL
SET @dsResponderA = @dsRemitente
IF @dsTipo IS NULL
SET @dsTipo = 'text/plain'
/*
INSERT INTO Correos (dsRemitente, dsRemitenteNombre,
dsDestinatario, dsDestinatarioNombre, dsDestinatarioCC,
dsDestinatarioCCO, dsResponderA, dsAsunto, dsTipo,
dsMensaje, dsMensajeArchivo, dsAdjuntos)
VALUES (@dsRemitente, @dsRemitenteNombre, @dsDestinatario,
@dsDestinatarioNombre, @dsDestinatarioCC,
@dsDestinatarioCCO, @dsResponderA, @dsAsunto, @dsTipo,
@dsMensaje, @dsMensajeArchivo, @dsAdjuntos)

*/
INSERT INTO SSBUETYGSM01.Gasmed.dbo.Correos
(dsRemitente, dsRemitenteNombre, dsDestinatario,
dsDestinatarioNombre, dsDestinatarioCC, dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos)
VALUES (@dsRemitente, @dsRemitenteNombre, @dsDestinatario,
@dsDestinatarioNombre, @dsDestinatarioCC,
@dsDestinatarioCCO, @dsResponderA, @dsAsunto, @dsTipo,
@dsMensaje, @dsMensajeArchivo, @dsAdjuntos)

IF @@ERROR <> 0
begin
INSERT INTO correos (dsRemitente,
dsRemitenteNombre, dsDestinatario, dsDestinatarioNombre,
dsDestinatarioCC, dsDestinatarioCCO, dsResponderA,
dsAsunto, dsTipo, dsMensaje, dsMensajeArchivo, dsAdjuntos)
VALUES (@dsRemitente, @dsRemitenteNombre,
@dsDestinatario, @dsDestinatarioNombre, @dsDestinatarioCC,
@dsDestinatarioCCO, @dsResponderA, @dsAsunto, @dsTipo,
@dsMensaje, @dsMensajeArchivo, @dsAdjuntos)
end
GO



Hola Horacio,

No entiendo porqué no hacer el insert en la tabla Correo


con el getdate() de
entrada, eso disparará el trigger que hará el insert en
SSBUETYGSM01.Gasmed.dbo.Correos, y nada más.
Lo que está haciendo en forma anidada es invocar al


trigger porque dentro de
él estás haciendo otro insert, que invocará al


trigger. y así.

Saludos, Liliana.

"Horacio" escribió


en el mensaje
news:300001c4a23f$a8122fa0$
Cuando hago un insert me tira el error que dice que esta
haciendo algo en forma anidada, que nose pueden hacer mas
transacciones para esa sesion.
Para evitar eso le agregué al final del select
where dtEnvio is null
para que no se repita, pero sigue tirando el mismo error.
Transcribo el mensaje:

Cannot start mor transactions on this session. Unable to
start a nested transaction for OLE DB provider. A nested
transaction was required because the XACT_ABORT option




was
set to OFF.



tenes razon, debe ser porque es viernes ;-)

mmm eso deberia funcionar bien, si usas el Getdate().






Vos
decis que no esta
insertando el campo fecha?


Salu2






-
-
-
Maxi
Buenos Aires - Argentina
Desarrollador Microsoft 3 Estrellas .NET






-
-
-
Nunca consideres el estudio como una obligación sino






como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Horacio" escribió


en el mensaje
news:22d001c4a236$2f0b9b40$
Hola Maxi!
Fijate bien, el getdate está en el select!
El problema es que se está haciendo algo en forma
recursiva, no? Cómo lo puedo evitar? o cual es la forma
correcta de modificar un dato en el momento de la
inserción?

Gracias!

HRC


Hola, el Getdate() va en el Select y no en la lista de


campos!! sino tambien
podes poner un Default en el campo


Salu2
-








-
-
-
-
Maxi
Buenos Aires - Argentina
Desarrollador Microsoft 3 Estrellas .NET
-








-
-
-
-
Nunca consideres el estudio como una obligación sino






como
una oportunidad para penetrar en el bello y








maravillosos
mundo del saber.
- Albert Einstein



"Horacio"








escribió
en el mensaje
news:2f0701c4a230$572a33d0$
Hola!
Ya estudié lo de linked servers y triggers, como
anteriormente me indicaron, para resolver mi problema.
Pero ahora me encuentro con otro.
Necesito poner la fecha actual en un campo(el último)








al
momento que se produce la inserción. ¿Cómo lo consigo?

Aqui esta lo que intenté hacer sin éxito:
CREATE TRIGGER Correos_insert
ON correos
FOR INSERT
AS
BEGIN TRANSACTION inserta
INSERT INTO SSBUETYGSM01.Gasmed.dbo.Correos
(dsRemitente, dsRemitenteNombre, dsDestinatario,
dsDestinatarioNombre, dsDestinatarioCC,




dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion)
SELECT dsRemitente, dsRemitenteNombre, dsDestinatario,
dsDestinatarioNombre, dsDestinatarioCC,




dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion
FROM inserted

IF @@ERROR <> 0
GOTO ErrorCode

insert into correos (dsRemitente, dsRemitenteNombre,
dsDestinatario, dsDestinatarioNombre, dsDestinatarioCC,
dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion, dtEnvio)
select dsRemitente, dsRemitenteNombre, dsDestinatario,
dsDestinatarioNombre, dsDestinatarioCC,




dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion, getdate()
from inserted


COMMIT TRANSACTION inserta

ErrorCode:
IF @@TRANCOUNT <> 0
PRINT 'Error Code'





Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system




(http://www.grisoft.com).
Version: 6.0.764 / Virus Database: 511 - Release Date:


15/09/2004


.






Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system




(http://www.grisoft.com).
Version: 6.0.764 / Virus Database: 511 - Release Date:


15/09/2004


.





.





.

Respuesta Responder a este mensaje
#9 Horacio
24/09/2004 - 19:18 | Informe spam
SET XACT_ABORT ON

BOL:

It is required that XACT_ABORT be set ON for data
modification statements in an implicit or explicit
transaction against most OLE DB providers, including SQL
Server. The only case where this option is not required is
if the provider supports nested transactions.

Gracias a todos!
En la "remota" no hay triggers y en la "local" tampoco,


el
que hice lo borré.
El tema sería insertar en la remota y si hay error


dejarlo
en la local para poder detectar que hubo error y no


perder
el correo que se quiso enviar.

¿Me estará faltando algo para poder usar el linked
server "remoto"?

Gracias
Horacio,
Por las dudas ¿no tendrás un trigger en la tabla del


linked server?
Fijate además que después del Insert, estás insertando




en
la segunda tabla
si @@error es distinto de cero, o sea, si hay error.

Liliana.

"Horacio" escribió


en el mensaje
news:30ce01c4a248$95aa0870$
Hola liliana!
Te cuento:
Los registros en la tabla correos llegan despues de que




se
llámó al SP spCorreosEncolar (ahora estoy intentando
olvidarme del trigger y hacer todo desde aqui, pero
surgieron otras cosas). Este sp hace el insert en la




tabla
correos.
Mi intención era que la fecha de envio se cargue SOLO
cuando se halla podido enviar a la tabla correos del
Linked Server, en caso de que no halla conexion no quiero
que se establezca la fecha de envío.
Bueno, borré el trigger. Y en el sp spCorreos encolar que
hacía el insert traté de hacer el insert directamente en
el linked server (despues de toparme con un BUG:
http://support.microsoft.com/defaul...cid=kb;en-
us;296769)
Pero para mi sorpresa me tira el mismo error!!!
Transcribo:
Error:Unable to start a nested transaction for OLE DB
provider 'SQLOLEDB'. A nested transaction was required
because the XACT_ABORT option was set to OFF. OLE DB




error
trace [OLE/DB Provider 'SQLOLEDB'
ITransactionLocal::StartTransaction returned 0x8004d013:
]. [OLE/DB provider returned message: Cannot
start more transactions on this session.] (TrEjecutar:
Microsoft OLE DB Provider for SQL Server).

Juro que borré el trigger!
este es el spCorreosEnclar modificado:

REATE PROCEDURE dbo.spCorreosEncolar (
@dsRemitente AS VARCHAR(100),
@dsRemitenteNombre AS VARCHAR(100),
@dsDestinatario AS VARCHAR(1000),
@dsDestinatarioNombre AS VARCHAR(100),
@dsDestinatarioCC AS VARCHAR(1000),
@dsDestinatarioCCO AS VARCHAR(1000),
@dsResponderA AS VARCHAR(100),
@dsAsunto AS VARCHAR(200),
@dsTipo AS VARCHAR(50),
@dsMensaje AS VARCHAR(8000),
@dsMensajeArchivo AS VARCHAR(1000),
@dsAdjuntos AS VARCHAR(1000)) AS
/********************************************************




*
*
************************
Encola los mails a ser enviados.
*********************************************************




*
*
***********************/
remitente del correo. (Obligatorio)
(NULO si no se especifica)
destinatario del correo. (Separados por coma si son
varios) (Obligatorio)
no se especifica)
destinatario en copia del correo. (Separados por coma si
son varios) (NULO si no se especifica)
destinatario en copia oculta del correo. (Separados por
coma si son varios) (NULO si no se especifica)
responderá el correo. (NULO si coincide con la dirección
del remitente del correo)
(Obligatorio)
mensaje [text/plain;text/html]. (NULO equivale a
text/plain)
(Obligatorio)
incluído en el mensaje del correo. (NULO si no se
especifica)
adjunto al correo (Separados por punto y coma si son
varios) (NULO si no se especifica)
IF @dsResponderA IS NULL
SET @dsResponderA = @dsRemitente
IF @dsTipo IS NULL
SET @dsTipo = 'text/plain'
/*
INSERT INTO Correos (dsRemitente, dsRemitenteNombre,
dsDestinatario, dsDestinatarioNombre, dsDestinatarioCC,
dsDestinatarioCCO, dsResponderA, dsAsunto, dsTipo,
dsMensaje, dsMensajeArchivo, dsAdjuntos)
VALUES (@dsRemitente, @dsRemitenteNombre,




@dsDestinatario,
@dsDestinatarioNombre, @dsDestinatarioCC,
@dsDestinatarioCCO, @dsResponderA, @dsAsunto, @dsTipo,
@dsMensaje, @dsMensajeArchivo, @dsAdjuntos)

*/
INSERT INTO SSBUETYGSM01.Gasmed.dbo.Correos
(dsRemitente, dsRemitenteNombre, dsDestinatario,
dsDestinatarioNombre, dsDestinatarioCC,




dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos)
VALUES (@dsRemitente, @dsRemitenteNombre,




@dsDestinatario,
@dsDestinatarioNombre, @dsDestinatarioCC,
@dsDestinatarioCCO, @dsResponderA, @dsAsunto, @dsTipo,
@dsMensaje, @dsMensajeArchivo, @dsAdjuntos)

IF @@ERROR <> 0
begin
INSERT INTO correos (dsRemitente,
dsRemitenteNombre, dsDestinatario, dsDestinatarioNombre,
dsDestinatarioCC, dsDestinatarioCCO, dsResponderA,
dsAsunto, dsTipo, dsMensaje, dsMensajeArchivo,




dsAdjuntos)
VALUES (@dsRemitente, @dsRemitenteNombre,
@dsDestinatario, @dsDestinatarioNombre,




@dsDestinatarioCC,
@dsDestinatarioCCO, @dsResponderA, @dsAsunto, @dsTipo,
@dsMensaje, @dsMensajeArchivo, @dsAdjuntos)
end
GO



Hola Horacio,

No entiendo porqué no hacer el insert en la tabla Correo


con el getdate() de
entrada, eso disparará el trigger que hará el insert en
SSBUETYGSM01.Gasmed.dbo.Correos, y nada más.
Lo que está haciendo en forma anidada es invocar al


trigger porque dentro de
él estás haciendo otro insert, que invocará al


trigger. y así.

Saludos, Liliana.

"Horacio" escribió


en el mensaje
news:300001c4a23f$a8122fa0$
Cuando hago un insert me tira el error que dice que esta
haciendo algo en forma anidada, que nose pueden hacer






mas
transacciones para esa sesion.
Para evitar eso le agregué al final del select
where dtEnvio is null
para que no se repita, pero sigue tirando el mismo






error.
Transcribo el mensaje:

Cannot start mor transactions on this session. Unable to
start a nested transaction for OLE DB provider. A nested
transaction was required because the XACT_ABORT option




was
set to OFF.



tenes razon, debe ser porque es viernes ;-)

mmm eso deberia funcionar bien, si usas el Getdate().






Vos
decis que no esta
insertando el campo fecha?


Salu2
-








-
-
-
-
Maxi
Buenos Aires - Argentina
Desarrollador Microsoft 3 Estrellas .NET
-








-
-
-
-
Nunca consideres el estudio como una obligación sino






como
una oportunidad para penetrar en el bello y








maravillosos
mundo del saber.
- Albert Einstein



"Horacio"








escribió
en el mensaje
news:22d001c4a236$2f0b9b40$
Hola Maxi!
Fijate bien, el getdate está en el select!
El problema es que se está haciendo algo en forma
recursiva, no? Cómo lo puedo evitar? o cual es la forma
correcta de modificar un dato en el momento de la
inserción?

Gracias!

HRC


Hola, el Getdate() va en el Select y no en la lista de


campos!! sino tambien
podes poner un Default en el campo


Salu2











-
-
-
-
-
Maxi
Buenos Aires - Argentina
Desarrollador Microsoft 3 Estrellas .NET











-
-
-
-
-
Nunca consideres el estudio como una obligación sino






como
una oportunidad para penetrar en el bello y








maravillosos
mundo del saber.
- Albert Einstein



"Horacio"








escribió
en el mensaje
news:2f0701c4a230$572a33d0$
Hola!
Ya estudié lo de linked servers y triggers, como
anteriormente me indicaron, para resolver mi problema.
Pero ahora me encuentro con otro.
Necesito poner la fecha actual en un campo(el último)








al
momento que se produce la inserción. ¿Cómo lo consigo?

Aqui esta lo que intenté hacer sin éxito:
CREATE TRIGGER Correos_insert
ON correos
FOR INSERT
AS
BEGIN TRANSACTION inserta
INSERT INTO SSBUETYGSM01.Gasmed.dbo.Correos
(dsRemitente, dsRemitenteNombre,










dsDestinatario,
dsDestinatarioNombre, dsDestinatarioCC,




dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion)
SELECT dsRemitente, dsRemitenteNombre,










dsDestinatario,
dsDestinatarioNombre, dsDestinatarioCC,




dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion
FROM inserted

IF @@ERROR <> 0
GOTO ErrorCode

insert into correos (dsRemitente, dsRemitenteNombre,
dsDestinatario, dsDestinatarioNombre,










dsDestinatarioCC,
dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion, dtEnvio)
select dsRemitente, dsRemitenteNombre, dsDestinatario,
dsDestinatarioNombre, dsDestinatarioCC,




dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion, getdate()
from inserted


COMMIT TRANSACTION inserta

ErrorCode:
IF @@TRANCOUNT <> 0
PRINT 'Error Code'





Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system




(http://www.grisoft.com).
Version: 6.0.764 / Virus Database: 511 - Release Date:


15/09/2004


.






Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system




(http://www.grisoft.com).
Version: 6.0.764 / Virus Database: 511 - Release Date:


15/09/2004


.





.





.



.

Respuesta Responder a este mensaje
#10 Edwin Marroquin
24/09/2004 - 22:13 | Informe spam
Hola.
Esta tabla:
SSBUETYGSM01.Gasmed.dbo.Correos

es la misma en la que tenes el trigger? ó es otro servidor
y otra base de datos en donde queres hacer este insert?


Hola!
Ya estudié lo de linked servers y triggers, como
anteriormente me indicaron, para resolver mi problema.
Pero ahora me encuentro con otro.
Necesito poner la fecha actual en un campo(el último) al
momento que se produce la inserción. ¿Cómo lo consigo?

Aqui esta lo que intenté hacer sin éxito:
CREATE TRIGGER Correos_insert
ON correos
FOR INSERT
AS
BEGIN TRANSACTION inserta
INSERT INTO SSBUETYGSM01.Gasmed.dbo.Correos
(dsRemitente, dsRemitenteNombre, dsDestinatario,
dsDestinatarioNombre, dsDestinatarioCC, dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion)
SELECT dsRemitente, dsRemitenteNombre, dsDestinatario,
dsDestinatarioNombre, dsDestinatarioCC, dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion
FROM inserted

IF @@ERROR <> 0
GOTO ErrorCode

insert into correos (dsRemitente, dsRemitenteNombre,
dsDestinatario, dsDestinatarioNombre, dsDestinatarioCC,
dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion, dtEnvio)
select dsRemitente, dsRemitenteNombre, dsDestinatario,
dsDestinatarioNombre, dsDestinatarioCC, dsDestinatarioCCO,
dsResponderA, dsAsunto, dsTipo, dsMensaje,
dsMensajeArchivo, dsAdjuntos, dtCreacion, getdate()
from inserted


COMMIT TRANSACTION inserta

ErrorCode:
IF @@TRANCOUNT <> 0
PRINT 'Error Code'


.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida