Un link interesante para estudiar es este... http://www.aulaclic.es/sqlserver/index.htm
Saludos a todos, Pancho Córdoba El 19 de junio de 2013 17:22, francisco prieto <[email protected]>escribió: > El jueves 27 estoy en Cordoba, en un evento cerca del Buen Pastor... si > bien no voy a tener tiempo de comer un asado ese dia bien podriamos > juntarnos a tomar un café. > > Saludos, > Pancho > > > > El 19 de junio de 2013 17:07, Ale Paciotti > <[email protected]>escribió: > >> Pancho, te ganaste un asado, este finde no, pero el otro voy para Capilla. >> Te llamo. >> Abrazo! >> >> >> El 19 de junio de 2013 16:45, Rafael Copquin >> <[email protected]>escribió: >> >>> ¡Che, qué buena explicación! >>> Muchas gracias >>> >>> Rafael Copquin >>> >>> >>> El 19/06/2013 09:22 a.m., francisco prieto escribió: >>> >>> Norberto... >>> >>> Si bien trabajo en la versión 2008 R2, tengo entendido que se programa >>> de la misma manera.... >>> >>> Abrís antes que nada el Microsoft Sql Server Management Studio y te >>> conectas a tu instancia de servidor que tenga la base de datos en cuestion. >>> >>> Si bien podría adjuntarte los tres triggers y decirte como se ejecutan >>> y se agregan, me parece mas educativo escribirtelos uno a uno y >>> explicártelos para que domines la técnica, ya que cada base de datos es un >>> mundo y el programador tiene que poder sobrevivir en cada uno de esos >>> mundos... (A propósito si bien contesto todo lo que puedo por el foro puede >>> que algún forista necesite una ayuda un poco mas personalizada para >>> entender tal o cual cuestión, es por eso que te aclaro que la mayoría de >>> mis clientes son programadores que necesitan esa mano extra... para que les >>> explique como se hace tal o cual cosa... esto no significa que por aqui no >>> te vaya a responder... pero por aquí respondo en el momento que tengo de >>> respiro entre programa y programa... siempre y cuando este conectado) >>> >>> Pasemos a la explicación: >>> >>> Antes que nada un Trigger o Desencadenador es un método que ejecuta el >>> motor de base de datos cuando se produce un determinado evento en una tabla >>> determinada. Así que un *trigger es un programa*. >>> >>> Este es el aspecto que tiene un Trigger de alta de una tabla en >>> particular: >>> >>> USE [ACE] >>> GO >>> /****** Object: Trigger [dbo].[InsCarriers] Script Date: 06/19/2013 >>> 08:01:22 ******/ >>> SET ANSI_NULLS ON >>> GO >>> SET QUOTED_IDENTIFIER ON >>> GO >>> >>> ALTER Trigger [dbo].[InsCarriers] On [dbo].[CARRIERS] For Insert >>> As >>> begin >>> declare @IdPar int >>> declare @IdTab int >>> declare @IdAct int >>> Select @IdPar=IdSucursal from PARAM >>> Select @IdTab=IdSucOri from Inserted >>> Set @IdAct=ISNULL(@IdTab,@IdPar) >>> Insert into Replica (Tabla,Fecha,Operacion,Referencia,IdSucOri) >>> Select 'Carriers',GETDATE(),'A',IdCarrier,@IdAct >>> From Inserted >>> end >>> >>> Ahora vamos con el análisis del código: >>> >>> Podemos ver que el código tiene 2 partes: >>> >>> - Una cabecera (antes del AS) donde se especifica en que lugar y >>> ante que evento se va a aplicar el Trigger. >>> - Un detalle (despues del AS y entre los delimitadores Begin y End) >>> en el cual esta escrito el programa en sí. >>> >>> Cuando con botón derecho se le pide al Management Studio crear un >>> nuevo trigger, nos pone la siguiente estructura que es genérica para >>> cualquier tipo y que nos va a servir para estudiar el trigger de ejemplo. >>> >>> -- ================================================ >>> -- Template generated from Template Explorer using: >>> -- Create Trigger (New Menu).SQL >>> -- >>> -- Use the Specify Values for Template Parameters >>> -- command (Ctrl-Shift-M) to fill in the parameter >>> -- values below. >>> -- >>> -- See additional Create Trigger templates for more >>> -- examples of different Trigger statements. >>> -- >>> -- This block of comments will not be included in >>> -- the definition of the function. >>> -- ================================================ >>> SET ANSI_NULLS ON >>> GO >>> SET QUOTED_IDENTIFIER ON >>> GO >>> -- ============================================= >>> -- Author: <Author,,Name> >>> -- Create date: <Create Date,,> >>> -- Description: <Description,,> >>> -- ============================================= >>> CREATE TRIGGER <Schema_Name, sysname, Schema_Name>.<Trigger_Name, >>> sysname, Trigger_Name> >>> ON <Schema_Name, sysname, Schema_Name>.<Table_Name, sysname, >>> Table_Name> >>> AFTER <Data_Modification_Statements, , INSERT,DELETE,UPDATE> >>> AS >>> BEGIN >>> -- SET NOCOUNT ON added to prevent extra result sets from >>> -- interfering with SELECT statements. >>> SET NOCOUNT ON; >>> >>> -- Insert statements for trigger here >>> >>> END >>> GO >>> >>> Bien, comparando ahora podemos ver lo siguiente: >>> >>> En primer lugar especifico cual es la base de datos que contiene la >>> tabla en cuestión. En este caso la base de datos es ACE, pero en forma >>> genérica sería: >>> >>> USE [Nombre de la base de datos] >>> >>> El script maneja lineas de comentario que pueden hacer de la siguiente >>> forma: >>> >>> >>> - Antecediendo -- a la linea (se forma un comentario por linea como >>> el * en VFP >>> - Poniendo un grupo de lineas entre los delimitadores /* y */. Esto >>> sirve para apartar rapidamente todo un código sin tener que tocarlo. >>> >>> Sigamos con el ejemplo, si el trigger existe se coloca la instrucción >>> ALTER TRIGGER delante del nombre para poder modificarlo, si en cambio se >>> trata de un trigger nuevo la instrucción será CREATE TRIGGER. >>> >>> El nombre del trigger (como todo objeto en la base de datos) esta >>> formado por un esquema que lo contiene (generalmente dbo), un punto usado >>> de separador y un nombre (se recomienda que el nombre sea lo >>> suficientemente expeditivo para indicar para que se usa, aunque se le puede >>> poner cualquier cosa). En este caso nuestro trigger se denomina >>> [dbo].[InsCarriers] (que es lo mismo poner dbo.InsCarriers ya que los >>> corchetes no son necesarios) >>> >>> En la misma linea se presenta el delimitador ON que nos indica >>> exactamente a que tabla va a estar asociado el trigger. En este caso la >>> tabla es [dbo].[CARRIERS] >>> >>> Finalmente en la misma linea se pueden presentar los siguientes >>> delimitadores: >>> >>> >>> - For o After: se activa cuando todas las operaciones especificadas >>> en la instrucción SQL desencadenadora se han ejecutado correctamente. >>> >>> - Instead Of: Especifica que se ejecuta el desencadenador en vez de la >>> instrucción SQL desencadenadora, por lo que se suplantan las acciones de >>> las instrucciones desencadenadoras. >>> >>> En nuestro caso utilizamos FOR, por lo tanto se va a ejecutar cuando la >>> acción se haya realizado correctamente. Y la acción de nuestro ejemplo es >>> Insert, pero podría haber sido (Update o Delete). >>> >>> Dependiendo de la versión de SQL te recomiendo que leas el siguiente >>> link http://msdn.microsoft.com/es-ar/library/ms189799.aspx >>> >>> Sigamos ahora con el detalle o cuerpo del Trigger. >>> >>> Como podrás ver a primera vista en una tabla inserto valores. En >>> nuestro ejemplo la tabla se denomina Replica. Es una tabla que ya debe >>> existir en la base de datos. >>> >>> En tu caso particular simplemente deberás realizar lo siguiente... >>> >>> Insert into Nombre_de_tu_tabla_duplicada (Campo1, Campo2, Campo3, >>> Campo4, Campo5, ...., CampoN) >>> Select Campo1, Campo2, Campo3, Campo4, Campo5, ...., CampoN >>> From Inserted >>> >>> Lo importante es que la palabra clave Inserted le indica al motor que >>> se trata del registro que acaba de insertar.(Fijate que esta palabra cambia >>> en el resto de los ejemplos que te envío mas adelante) >>> >>> De todos modos y aunque no lo vayas a usar ahora te explico el resto >>> del código. >>> >>> Si tuvieras que extraer un campo de alguna tabla externa, como en este >>> caso: >>> >>> Select @IdPar=IdSucursal from PARAM >>> >>> Debes declarar en primer lugar la variable que pueda contener el valor >>> respectivo... Si te fijas la variable la declaro como: >>> >>> declare @IdPar int >>> >>> Una vez que el valor esta contenido en una variable, podes hacer >>> cálculos, comparaciones y asignaciones, como en este caso: >>> >>> Set @IdAct=ISNULL(@IdTab,@IdPar) >>> >>> En este ejemplo particular dice que si @IdTab es nulo le asigne el >>> contenido de @IdPar a @IdAct, sino que le asigne el de @IdTab >>> >>> Y en una insersión a una tabla no solo podes asignar campos o >>> variables, sino que también podes asignar valores, como en este caso: >>> >>> Insert into Replica (Tabla,Fecha,Operacion,Referencia,IdSucOri) >>> Select 'Carriers',GETDATE(),'A',IdCarrier,@IdAct >>> From Inserted >>> >>> Si bien podría resultar hasta aquí que todo esta bien explicado, puede >>> resultar útil leer los siguientes links: >>> >>> http://msdn.microsoft.com/es-es/library/ff848807.aspx >>> http://msdn.microsoft.com/es-es/library/ms188927.aspx >>> http://msdn.microsoft.com/es-es/library/ms187953(v=sql.105).aspx >>> http://msdn.microsoft.com/es-es/library/ms180796(v=sql.105).aspx >>> http://msdn.microsoft.com/es-es/library/ms189626(v=sql.105).aspx >>> >>> y como puede chocar un poco como se programarían los eventos Update y >>> Delete. Te dejo esos otros 2 programas para que los estudies y apliques. >>> >>> USE [ACE] >>> GO >>> /****** Object: Trigger [dbo].[UpdCarriers] Script Date: 06/19/2013 >>> 09:11:30 ******/ >>> SET ANSI_NULLS ON >>> GO >>> SET QUOTED_IDENTIFIER ON >>> GO >>> >>> ALTER Trigger [dbo].[UpdCarriers] On [dbo].[CARRIERS] For Update >>> As >>> begin >>> declare @IdPar int >>> declare @IdTab int >>> declare @IdAct int >>> Select @IdPar=IdSucursal from PARAM >>> Select @IdTab=IdSucOri from Inserted >>> Set @IdAct=ISNULL(@IdTab,@IdPar) >>> Insert into Replica (Tabla,Fecha,Operacion,Referencia,IdSucOri) >>> Select 'Carriers',GETDATE(),'M',IdCarrier,@IdAct >>> From Inserted >>> end >>> >>> >>> USE [ACE] >>> GO >>> /****** Object: Trigger [dbo].[DelCarriers] Script Date: 06/19/2013 >>> 09:11:53 ******/ >>> SET ANSI_NULLS ON >>> GO >>> SET QUOTED_IDENTIFIER ON >>> GO >>> >>> /** CARRIERS **/ >>> ALTER Trigger [dbo].[DelCarriers] On [dbo].[CARRIERS] For Delete >>> As >>> begin >>> declare @IdPar int >>> declare @IdTab int >>> declare @IdAct int >>> Select @IdPar=IdSucursal from PARAM >>> Select @IdTab=IdSucOri from Deleted >>> Set @IdAct=ISNULL(@IdTab,@IdPar) >>> Insert into Replica (Tabla,Fecha,Operacion,Referencia,IdSucOri) >>> Select 'Carriers',GETDATE(),'B',IdCarrier,@IdAct >>> From Deleted >>> end >>> >>> Espero haber sido claro. >>> >>> Ante cualquier duda preguntá. >>> >>> Saludos, >>> >>> Pancho >>> Córdoba >>> >>> >>> >>> >>> >>> El 18 de junio de 2013 21:13, norberto szerman >>> <[email protected]>escribió: >>> >>>> Hola Pancho. >>>> >>>> Ahora respiro. >>>> >>>> Sí, estoy trabajando con SQL Server, para más datos 2005. >>>> >>>> Una duda: ya con el código del trigger definido, ¿Dónde lo almaceno, si >>>> es que esta es la palabra correcta? >>>> >>>> En Management Studio Ex hay plantillas de triggers y de tablas, pero no >>>> supe usarlas. >>>> >>>> Tienen demasiados conceptos que no domino. >>>> >>>> Gracias por tu ayuda desde los pagos cordobeses. >>>> >>>> El pasado lunes hubo en el MUG un curso a distancia sobre SQL Server, >>>> ideal para preguntar. >>>> >>>> Estaba anotado pero no lo pude tomar porque a esa hora tuve que dar >>>> clase. >>>> >>>> Estoy dando cursos de office como materias extracurriculares en la UBA. >>>> >>>> Aprovecho para decirte que visites www.szerman.com.ar, para que veas >>>> los libros que he publicado de puro corajudo, nomás. >>>> >>>> No te envío las capturas porque ya no vale la pena. >>>> >>>> Soy escritor y por eso “larguero”. No lo puedo evitar. >>>> >>>> Gracias de nuevo. >>>> >>>> >>>> >>>> Norberto >>>> >>>> >>>> >>>> *De:* [email protected] [mailto:[email protected]] *En nombre de *francisco >>>> prieto >>>> >>>> *Enviado el:* martes, 18 de junio de 2013 20:39 >>>> *Para:* GUFA List Member >>>> >>>> *Asunto:* [GUFA] Re: [GUFA] Error 3626 al víncular tabla SQL en Access >>>> - ¿OT? >>>> >>>> >>>> >>>> >>>> >>>> El 18 de junio de 2013 20:31, norberto szerman <[email protected]> >>>> escribió: >>>> >>>> error 3626 >>>> >>>> >>>> Norberto recordame algo.... >>>> >>>> >>>> >>>> El motor con el que estas trabajando es SQL Server? Si es asi, avisame >>>> y te armo los triggers para que puedas resolver el inconveniente. >>>> >>>> >>>> >>>> Saludos, >>>> >>>> >>>> >>>> Pancho >>>> >>>> PD: Y es cierto no recibí el error... >>>> >>> >>> >>> >> >> >> -- >> [email protected] >> > >
