Inicio > SQL Server > panzaverde > Problemon con los disparadores

Problemon con los disparadores

Experto:
Usuario:
Fecha: 09/09/2008
Valoración: (5,00 sobre 5) Categoría: SQL Server
09/09/2008
repv, usuario preguntando en SQL Server
Usuario
Buen día Experto,

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>
09/09/2008
repv, experto respondiendo en SQL Server
Experto
La verdad que no recuerdo si te permiten triggers que escriban en otras bases, pero lo mas 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 busqueda

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 =*.
09/09/2008
repv, usuario preguntando en SQL Server
Usuario
Hola experto, realice un trigger sencillo de para insertara en una base de datos y me funciono te adjunto el scrip

<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
09/09/2008
repv, experto respondiendo en SQL Server
Experto
No probé tu primer consulta, ¿te dá 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 x 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.
09/09/2008
repv, usuario preguntando en SQL Server
Usuario
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.

Que más puedo hacer?
09/09/2008
repv, experto respondiendo en SQL Server
Experto
2 From? Lo unico que tenes 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 ahi si prueba de crear el trigger.
09/09/2008
repv, usuario preguntando en SQL Server
Usuario
Me ayudo mucho tus recomendaciones realice algunos ajustes y qedó asi:

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
Enlaces patrocinados