Compartir a través de


Crear desencadenadores DML

En este tema se describe cómo crear un desencadenador DML de Transact-SQL mediante SQL Server Management Studio y usando la instrucción CREATE TRIGGER de Transact-SQL.

Antes de empezar

Limitaciones y restricciones

Para obtener una lista de las limitaciones y restricciones relacionadas con la creación de desencadenadores DML, vea CREATE TRIGGER (Transact-SQL).

Permisos

Es necesario contar con permiso ALTER sobre la tabla o vista en la que se crea el desencadenador.

Cómo crear un desencadenador DML

Puede usar cualquiera de los siguientes medios:

  • SQL Server Management Studio

  • Transact-SQL

Usar SQL Server Management Studio

  1. En el Explorador de objetos, conéctese a una instancia de Motor de base de datos y expándala.

  2. Expanda Databases, expanda la base de datos AdventureWorks2012 , expanda Tablas y a continuación expanda la tabla Purchasing.PurchaseOrderHeader.

  3. Haga clic con el botón secundario en Desencadenadores y, después, seleccione Nuevo desencadenador.

  4. En el menú Consulta, haga clic en Especificar valores para parámetros de plantilla. De manera alternativa, puede presionar (Ctrl+Shift-M) para abrir el cuadro de diálogo Especificar valores para parámetros de plantilla.

  5. En el cuadro de diálogo Especificar valores para parámetros de plantilla, especifique los siguientes valores para los parámetros mostrados.

    Parámetro

    Valor

    Autor

    Your name

    Create Date

    Today's date

    Descripción

    Comprueba la solvencia del proveedor antes de permitir que se inserte un nuevo pedido de compra con el proveedor.

    Schema_Name

    Purchasing

    Trigger_Name

    NewPODetail2

    Table_Name

    PurchaseOrderDetail

    Data_Modification_Statement

    Quite UPDATE y DELETE de la lista.

  6. Haga clic en Aceptar.

  7. En el Editor de consultas, reemplace el comentario -- Insert statements for trigger here con la instrucción siguiente:

    IF @@ROWCOUNT = 1
    BEGIN
       UPDATE Purchasing.PurchaseOrderHeader
       SET SubTotal = SubTotal + LineTotal
       FROM inserted
       WHERE PurchaseOrderHeader.PurchaseOrderID = inserted.PurchaseOrderID
    
    END
    ELSE
    BEGIN
          UPDATE Purchasing.PurchaseOrderHeader
       SET SubTotal = SubTotal + 
          (SELECT SUM(LineTotal)
          FROM inserted
          WHERE PurchaseOrderHeader.PurchaseOrderID
           = inserted.PurchaseOrderID)
       WHERE PurchaseOrderHeader.PurchaseOrderID IN
          (SELECT PurchaseOrderID FROM inserted)
    END;
    
  8. Para comprobar que la sintaxis es válida, en el menú Consulta, haga clic en Analizar. Si se devuelve un mensaje de error, compare la instrucción con la información anterior y corrija lo que sea necesario y repita este paso.

  9. Para crear el desencadenador DML, en el menú Consulta, haga clic en Ejecutar. El desencadenador DML se crea como un objeto de la base de datos.

  10. Para ver el desencadenador DML que aparece en el Explorador de objetos, haga clic con el botón secundario en Desencadenadores y seleccione Actualizar.

[Arriba]

Usar Transact-SQL

  1. En el Explorador de objetos, conéctese a una instancia de Motor de base de datos y expándala.

  2. En el menú Archivo, haga clic en Nueva consulta.

  3. Copie y pegue el ejemplo siguiente en la ventana de consulta y haga clic en Ejecutar. Este ejemplo crea el mismo desencadenador DML almacenado que antes.

    -- Trigger valid for multirow and single row inserts
    -- and optimal for single row inserts.
    USE AdventureWorks2012;
    GO
    CREATE TRIGGER NewPODetail3
    ON Purchasing.PurchaseOrderDetail
    FOR INSERT AS
    IF @@ROWCOUNT = 1
    BEGIN
       UPDATE Purchasing.PurchaseOrderHeader
       SET SubTotal = SubTotal + LineTotal
       FROM inserted
       WHERE PurchaseOrderHeader.PurchaseOrderID = inserted.PurchaseOrderID
    
    END
    ELSE
    BEGIN
          UPDATE Purchasing.PurchaseOrderHeader
       SET SubTotal = SubTotal + 
          (SELECT SUM(LineTotal)
          FROM inserted
          WHERE PurchaseOrderHeader.PurchaseOrderID
           = inserted.PurchaseOrderID)
       WHERE PurchaseOrderHeader.PurchaseOrderID IN
          (SELECT PurchaseOrderID FROM inserted)
    END;
    

[Arriba]