Trigger for two column recursively

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • cureben
    New Member
    • Aug 2010
    • 3

    #1

    Trigger for two column recursively

    Hi all,
    I am beginner on SQL and I am stuck with trigger.
    I'm trying to create a Trigger for two columns (KG ,Items)
    Basicly if column KG is inserted/updated then compute column Items. If column Items is inserted/updated then compute column KG.

    It is kind of converter.I have tried as below:
    Code:
    --------------------------------------------------------
    CREATE TRIGGER [dbo].[UpdateItemsOrKg] 
       ON  [dbo].[UpdateItemsOrKg] 
      AFTER INSERT,UPDATE
    AS 
    BEGIN
    	SET NOCOUNT ON;
    
    DECLARE @Factor decimal(8,3) 
    
    SELECT @Factor=Factor FROM dbo.CurrentFactors
    
    IF UPDATE(Items) 
    BEGIN
    	UPDATE [dbo].[UpdateItemsOrKg] 
    	SET [KG] = @items*@Factors
    END
    
    IF UPDATE(KG)
    BEGIN
    	UPDATE [dbo].[UpdateItemsOrKg] 
    	SET [Items] = @KG/@Factors
    END
    --------------------------------------
    Is no problem when colums is updated (procedure from excel spreadsheet), updated is only one column KG or Items, but when is new record then updated column has a null value and another computed column is calculate absolutely correctly.

    Thanks for any advice.
    Last edited by Niheel; Aug 10 '10, 07:25 PM.
  • Alex Papadimoulis
    Recognized Expert New Member
    • Jul 2010
    • 26

    #2
    There is a way to do this, but it's not pretty.

    Actually, what you're doing isn't very pretty either. You'd probably be best computing this in intermediary code (stored procedure, applicationc code, etc), since it's a pretty strange feature of a table.

    That said, there is a function called COLUMNS_UPDATED which will indicate which column was updated. If you use it in conjunction with COLUMNPROPERTY, you can tell which columns on your table were updated.

    Comment

    • NeoPa
      Recognized Expert Moderator MVP
      • Oct 2006
      • 32669

      #3
      Have you considered whether the update within the trigger routine would trigger itself?

      You would want to avoid an interminable loop I would suggest.

      Comment

      • Alex Papadimoulis
        Recognized Expert New Member
        • Jul 2010
        • 26

        #4
        Good point, NeoPa. To add to my previous reply...

        An AFTER UPDATE trigger on table that updates the same table (a "direct recursion") will not, by default, trigger itself. However, if you were to set the database option RECURSIVE_TRIGG ERS (I don't recommended it), then a direct recusion could occur, allowing for the trigger to trigger itself. This would then cause a stack overflow error, or as SQL Server calls it, "exceeding maximum nesting level."

        Of course, if RECURSIVE_TRIGG ERS is set, then you could simply do an INSTEAD OF UPDATE trigger, as INSTEAD OF triggers cannot cause direct recursion. If you go with an INSTEAD OF trigger, you will need to update all columns yourself.

        Comment

        • NeoPa
          Recognized Expert Moderator MVP
          • Oct 2006
          • 32669

          #5
          It sounds like less of a problem than I'd imagined actually. Excuse my relative inexperience with SQL Server. I'm just getting back into it again since getting MCP in 2000 years ago (I mention that merely to illustrate how little an MCP can know - especially after a lapse of a few years).

          Comment

          • cureben
            New Member
            • Aug 2010
            • 3

            #6
            Alex I agree with you, it is not pretty what I've tried to do.
            It seems that both the best and fastest way (for me) it will be computing this in application code.
            I just thought that maybe in SQL is feature which I don't know yet. As I have mentioned I am beginner( I started play with SQL 2 months ago). Unfortunately I have to finish project quickly so I have no time to check COLUMNS_UPDATED , but it seems that it should be a good option.If it comes to "avoid an interminable loop" I think it would be stop by
            if @@Nestlevel>1
            RETURN

            Thanks for all advice.

            Comment

            Working...