MS SQL Server
  Home arrow MS SQL Server arrow Page 4 - Trigger Specifics
ASP Free Forums 
.NET  
ASP  
ASP Code  
ASP.NET  
ASP.NET Code  
BrainDump  
C#  
Code Examples  
Database  
Database Code  
IIS  
Microsoft Access  
MS SQL Server  
Visual Basic.NET  
Windows Scripting  
Windows Security  
XML  
ASP Web Hosting  
ASP.NET Web Hosting 
Mobile Linux 
App Generation ROI 
Windows Web Hosting
 
IBM® developerWorks 
Sun Developer Network 
Weekly Newsletter
 
Developer Updates  
Free Website Content 
 RSS  Articles
 RSS  Forums
 RSS  All Feeds
Write For Us Get Paid 
Request Media Kit
Contact Us 
Site Map 
Privacy Policy 
Support 
 USERNAME
 
 PASSWORD
 
 
  >>> SIGN UP!  
  Lost Password? 
MS SQL SERVER

Trigger Specifics
By: McGraw-Hill/Osborne
  • Search For More Articles!
  • Disclaimer
  • Author Terms
  • Rating: 5 stars5 stars5 stars5 stars5 stars / 4
    2006-09-07

    Table of Contents:
  • Trigger Specifics
  • Nested and Recursive Triggers
  • Instead-of Triggers
  • Triggers on Views

  • Rate this Article: Poor Best 
      ADD THIS ARTICLE TO:
      Del.ici.ous Digg
      Blink Simpy
      Google Spurl
      Y! MyWeb Furl
    Email Me Similar Content When Posted
    Add Developer Shed Article Feed To Your Site
    Email Article To Friend
    Print Version Of Article
    PDF Version Of Article
     
     
    ADVERTISEMENT


    Trigger Specifics - Triggers on Views


    (Page 4 of 4 )

    Instead-of triggers can be defined on views also. In the following example, a trigger is created on a view that displays fields from two tables:

    Create View dbo.vEquipment
    AS
    Select Equipment.EqId,
           Equipment.Make,
           Equipment.Model,
           EqType.EqType
    From dbo.Equipment Equipment
    Inner Join dbo.EqType EqType
    On
    Equipment.EqTypeId = EqType.EqTypeId
    Go

    Create Trigger itr_vEquipment_I
    On dbo.vEquipment
    instead of Insert
    As
    -- If the EqType is new, insert it
    If exists(select EqType
              from inserted
              where EqType not in (select EqType
                                     from EqType))
        -- we need to insert the new ones
        insert into EqType(EqType)
            select EqType
            from inserted
            where EqType not in (select EqType
                                 from EqType)

    -- now you can insert new equipment
    Insert into Equipment(Make, Model, EqTypeId)
    Select inserted.Make, inserted.Model, EqType.EqTypeId
    From inserted Inner Join EqType
    On inserted.EqType = EqType.EqType

    GO

    Insert Into vEquipment(EqId, Make, Model, EqType)
    Values (-777, 'Microsoft', 'Natural Keyboard', 'keyboard')

    The trigger first examines whether the Inserted table contains EqType values that do not exist in EqTable. If they exist, they will be inserted in the EqType table. At the end, values from the Inserted table are added to the Equipment table.

    The previous example illustrates one unusual feature in the use of Instead-of triggers on views. Since EqId is referenced by the view, it can (and must) be specified by the modification statement (Insert statement). The trigger can (and will) ignore the specified value since it is inserted automatically (EqId is an identity field in the base table). The reason for this behavior is that the Inserted and Deleted tables have different structures from the base tables on which the view is based. They have the same structure as the Select statement inside the view.

    Columns in the view can be nullable or not nullable. The column is nullable if its expression in the Select list of the view satisfies one of the following criteria:

    • The view column references a base table column that is nullable.
    • The view column expression uses arithmetic operators or functions.

    If the column does not allow nulls, an Insert statement must provide a value for it. This is the reason a value for the EqId column was needed in the previous example. An Update statement must provide values for all non-nullable columns referenced by the Set clause in a view with an Instead-of update trigger.

    NOTE


    You must specify values even for view columns that are mapped to timestamp , Identity, or computed-base table columns.

    You can use the AllowNull property of the ColumnProperty() function (table function) to examine which fields are nullable from code.

    NOTE


    The previous code example is much more important than you might think. It allows you to insert a whole set of records at one time into the view (actually to the set of base tables behind the view). Before Instead-of triggers, you had to do this record by record with a stored procedure. This capability is very useful for loading information into a SQL Server database. For example, you can load information from a denormalized source (such as a flat file) and store it in a set of normalized, linked tables.

    Another unusual feature of Instead-of triggers is the fact that they support text, ntext, and image columns in Inserted and Deleted tables. After triggers cannot handle these data types. In base tables, text, ntext, and image columns actually contain pointers to the pages holding data. In Inserted and Deleted tables, text, ntext, and image columns are stored as continuous strings within each row. No pointers are stored in these tables, and therefore the use of the Textptr() and Textvalid() functions and the Readtext, Updatetext, and Writetext statements is not permitted. All other uses are valid, such as references in the Select list or Where clause, or the use of Charindex(), Patindex(), or Substring() functions.

    However, you can always use new varchar(max), Nvarchar(max), and varbinary(max) instead of old BLOB fields:

    CREATE TRIGGER itrOrder_D ON dbo.OrderHeader
    INSTEAD OF DELETE
    AS
    BEGIN

    SET NOCOUNT ON

    -- collect deleted Orders in OrderDeleted INSERT INTO [dbo].[OrderDeleted]
         ([OrderId],[OrderDate],[RequestedById]
         ,[TargetDate],[CompletionDate],[DestinationLocationId]
         ,[Note],[OrderTypeId],[OrderStatusid]
         ,[UserName],[ChangeDT])
    SELECT [OrderId],[OrderDate],[RequestedById]
         ,[TargetDate],[CompletionDate],[DestinationLocationId]
         ,[Note],[OrderTypeId],[OrderStatusid]
         , SUSER_SNAME(), GETDATE()
    FROM deleted

    delete dbo.[OrderHeader]
    where OrderId in (select OrderId from deleted)

    END
    GO

    Please check back next week for the continuation of this article.


    DISCLAIMER: The content provided in this article is not warranted or guaranteed by Developer Shed, Inc. The content provided is intended for entertainment and/or educational purposes in order to introduce to the reader key ideas, concepts, and/or product reviews. As such it is incumbent upon the reader to employ real-world tactics for security and implementation of best practices. We are not liable for any negative consequences that may result from implementing any information covered in our articles or tutorials. If this is a hardware review, it is not recommended to open and/or modify your hardware.

       · This article is an excerpt from the book "Microsoft SQL Server 2005 Stored Procedure...
     

    Buy this book now. This article is excerpted from chapter nine of the book Microsoft SQL Server 2005 Stored Procedure Programming in T-SQL and .NET, written by Dejan Sunderic (McGraw-Hill/Osborne, 2006; ISBN: 0072262281). Check it out today at your favorite bookstore. Buy this book now.

    MS SQL SERVER ARTICLES

    - Completing the Introduction to Transact-SQL
    - A Brief Introduction to Transact-SQL
    - Lookups and Blocking Bad Data
    - Field Validation Rules for Blocking Bad Data
    - Using Masks to Block Bad Data
    - Blocking Bad Data
    - Using @@ROWCOUNT and TABLE Variables for Dat...
    - How to Use Variables, IF and CASE in Databas...
    - Creating Important Aspects of Notification S...
    - Working wth Variables in Database Interactio...
    - Delving Deeper into Notification Services
    - Notification Services
    - Building a Multi-table Report with SQL 2005 ...
    - A Secure Way of Building Connection Strings
    - Transferring a Database Using the SSIS Desig...





    © 2003-2008 by Developer Shed. All rights reserved. DS Cluster 6 hosted by Hostway
    Stay green...Green IT