Problemón con los disparadores

Debo hacer un disparador tipo Insert, de una base de dato db1 a otra base de datos db2, el problema viene cuando genero el select es desde varias tablas, como puedo hacer esto
Te adjunto el query que estoy haciendo
CREATE TRIGGER JobBossLand
on training.dbo.invoice_header
AFTER INSERT 
AS 
insert into   P01.dbo.FACENCABEZADOFACTURAVENTA(FACPrefijoFacturaVentaEncabezadoFacturaVenta, FACNumeroFacturaVentaEncabezadoFacturaVenta, FACIdDocumentoEncabezadoFacturaVenta,FACCodigoTipoDocumentoEncabezadoFacturaVenta, FACIdentificadorUnoVendedorEncabezadoFacturaVenta,FACSucursalVendedorEncabezadoFacturaVenta, FACIdentificadorDosVendedorEncabezadoFacturaVenta, FACFechaFacturaEncabezadoFacturaVenta, FACIdentificadorDosClienteEncabezadoFacturaVenta, FACIdentificadorUnoClienteEncabezadoFacturaVenta, FACSucursalClienteEncabezadoFacturaVenta, FACNumeroDocto1EncabezadoFacturaVenta, FACNumeroDocto2EncabezadoFacturaVenta, FACPlazoEncabezadoFacturaVenta, FACCodigoMonedaEncabezadoFacturaVenta, FACTasaCambioEncabezadoFacturaVenta, FACEstadoEncabezadoFacturaVenta, FACPorcDescComercialUnoEncabezadoFacturaVenta, FACPorcDescComercialDosEncabezadoFacturaVenta, FACPorcDescComercialTresEncabezadoFacturaVenta, FACPorcDescFinancieroUnoEncabezadoFacturaVenta, FACPorcDescFinancieroDosEncabezadoFacturaVenta, FACPorcDescFinancieroTresEncabezadoFacturaVenta, FACDiasDescFinancieroUnoEncabezadoFacturaVenta, FACDiasDescFinancieroDosEncabezadoFacturaVenta, FACDiasDescFinancieroTresEncabezadoFacturaVenta, FACNroCuotasEncabezadoFacturaVenta, FACPeriodicidadEncabezadoFacturaVenta, FACPorcentajeFinanciacionEncabezadoFacturaVenta, FACFormulaEncabezadoFacturaVenta, FACValorInicialEncabezadoFacturaVenta, FACValorNetoEncabezadoFacturaVenta, FACTransportadorEncabezadoFacturaVenta, FACPorcRetencionIvaEncabezadoFacturaVenta, FACPorcRetencionIcaEncabezadoFacturaVenta, FACComentariosEncabezadoFacturaVenta, FACOrigenMovimientoEncabezadoFacturaVenta, FACImpresoEncabezadoFacturaVenta, FACHoraEncabezadoFacturaVenta, FACprefijoCotizacionFacturaVenta, FACNumeroCotizacionFacturaVenta)
SELECT  '00000', '00000000000' + Invoice_Header.Document, 'VE', 'FV', Employee.SSN, '000', Employee.SSN, Invoice_Header.Trade_Date, User_Values.Text1, User_Values.Text1, '000', '', '', 0, '', 0, 'DI', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', 0, Invoice_Header.Taxable_Amt * 1.16, '', 0, 0, '', 'FAC', 0, '05:00:00 PM', '', ''
<span style="white-space: pre;"> </span>FROM Invoice_Header INNER JOIN
             Customer ON Invoice_Header.Customer = Customer.Customer INNER JOIN
             User_Values ON Customer.User_Values = User_Values.User_Values INNER JOIN
             Employee ON Customer.Sales_Rep = Employee.Employee
<div>o como mas se puede hacer???</div>

1 Respuesta

Respuesta
1
La verdad que no recuerdo si te permiten triggers que escriban en otras bases, pero lo más sencillo si son INNER JOINS es hacer:
insert into db2..tabla    (o db2.dbo.tabla)
select col1, col2, ...
from tabla1 t1, tabla2 t2, tabla 3 t3....
where  -- condiciones para el join
t1.key1=t2.fkey2
and t2.key2=t3.fkey3
AND ... condiciones de búsqueda
¿Era esa tu duda?
Donde no haya valores, vas a tener que hacer un outer_join, ahi quiza sea mejor usar la notacion ansi que estabas usando, sino  el left join es equivalente a *= en la condicion del join, el right es =*.
Hola experto, realice un trigger sencillo de para insertara en una base de datos y me funciono te adjunto el script
<span style="border-collapse: collapse; color: #4a4a4a; font-family: Arial; line-height: 17px;">/*SCRIPT DE LAS 2 TABLAS*/ 
--TABLA1 en la primera base de datos. 
use prueba_trigger 
CREATE TABLE empleados 

idempleado int NOT NULL, 
nombre varchar(50) NULL, 
apellido varchar(10) NULL 

--TABLA2 en la segunda base de datos. 
use prueba_trigger2 
CREATE TABLE empleados2 

idempleado int NOT NULL, 
nombre varchar(50) NULL, 
apellido varchar(10) NULL 

--script del trigger de la primera base de datos para que pueda inserta en la segunda base de datos.
--DEBES ESTAR EN LA BASE DE DATOS: prueba_trigger 
CREATE TRIGGER TRIGER_INSERTA_EMPLEADOS 
on prueba_trigger.dbo.empleados 
AFTER INSERT 
AS 
insert into prueba_trigger2.dbo.empleados2 (idempleado,nombre,apellido) select idempleado,nombre,apellido from inserted 
--PRUEBA DE INSERCION , QUE SE REFLEJARA EN LA SEGUNDA TABLA "prueba_trigger2.dbo.empleados2" 
insert into prueba_trigger.dbo.empleados (idempleado,nombre,apellido) values(6,'Juan','Perez') 
--QUERY para consultar las 2 inserciones 
select * from prueba_trigger.dbo.empleados 
select * from prueba_trigger2.dbo.empleados2 </span>
Pero el trigger insertas la mimas columnas en la otra tabla de otra base de datos, pero lo que necesito es que realice una consulta conformada por varias tablas y que la inserte en la segunda base de datos.
No se si me entendiste.
Voy a probar tu recomendación o si tiens otra muchas gracias
No probé tu primer consulta, ¿te da algún problema?
Lo que yo te propuse es una notación distinta nada más, pero quizá no entienda cuál es tu problema, porque tu ejemplo es distinto. El ejemplo similar sería el de empleados y ventas por ejemplo; haríamos el join por algún id_empleado que se guarda en la tabla de ventas, indicando el empleado por realizó la venta. Si las tablas están en distintas bases sólo hay que cualificar las tablas
Select E.id_empleado, E.nombre, V.monto, V.Unidades, etc
from db1..empleado as E, db2..ventas as V
where E.id_empleado=V.id_empleado
Y al insert lo realizas donde quieras.
Creandolo segun tus recomendaciones me da esto
CREATE TRIGGER JobBossLand
on training.dbo.invoice_header
AFTER INSERT 
AS 
insert into   P01.dbo.FACENCABEZADOFACTURAVENTA(campo1, campo2)
SELECT  '00000', '00000000000' + I.Document, 'VE', 'FV', E.SSN, '000', E.SSN, I.Trade_Date, U.Text1, U.Text1, '000', '', '', 0, '', 0, 'DI', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', 0, I.Taxable_Amt * 1.16, '', 0, 0, '', 'FAC', 0, '05:00:00 PM', '', ''
FROM Invoice_Header I, Customer C, User_Values U, Employee E
Where I.Customer = C.Customer and C.User_Values = U.User_Values and C.Sales_Rep = E.Employee
from inserted
Al ejecutarlo me da errores, sera por que tiene dos from, uno para la consulta de vartias tablas, el segundo que pertene al trigger.
Servidor: mensaje 170, nivel 15, estado 1, procedimiento JobBossLand, línea 6
Line 6: Incorrect syntax near ','.
He revisado todo e inclusive le gregue los () al select pero de igual forma nada.
¿Qué más puedo hacer?
¿2 From? Lo único que tienes que tener es el from de FROM Invoice_Header I, Custo ...
Puede ser que tengas problemas con alguna comilla, trata de copiar el select solamente en la herramienta donde tiras las consultas (supongo que analizador de consultas) y así lo puedes ir debugeando, una vez que esté bien ahí si prueba de crear el trigger.
Me ayudo mucho tus recomendaciones realice algunos ajustes y qedó así:
CREATE TRIGGER JobBossLand
on training.dbo.invoice_header
AFTER INSERT 
AS 
insert into   P01.dbo.FACENCABEZADOFACTURAVENTA(campos....)
SELECT  '00000', '00000000000' + i.Document, 'VE', 'FV', E.SSN, '000', E.SSN, format(i.Trade_Date,MM/dd/aaaa), U.Text1, U.Text1, '000', '', '', 0, null, 0, 'DI', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '', 0, i.Taxable_Amt * 1.16, '', 0, 0, '', 'FAC', 0, '05:00:00 PM', '', ''
FROM inserted I, Customer C, User_Values U, Employee E
Where I.Customer = C.Customer and C.User_Values = U.User_Values and C.Sales_Rep = E.Employee
El error se generaba debido a que no se referenciaba el campo insertado en la tabla 1 que es Inserted, ya con esto me dio.
Muchas Gracias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas