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]
>>
>
>

Responder a