How to add “IF NOT EXISTS” to create trigger statement

后端 未结 4 777
无人及你
无人及你 2021-01-01 09:03

I am using sql server 2008 R2. More specifically, Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright (c) Microsoft Corporation Stan

相关标签:
4条回答
  • 2021-01-01 09:07

    As other answers above not mentioned an important point I wrote this answer:

    • When we want to find a trigger or another object in sys.objects table, it is better to check accurately (with schema or object_id, etc) in where clause to avoid same name invalid results. Consider when another trigger with the same name already exists in another schema... Therefore, because the sys.object table contains an schema_id column, we can use it in addition to name and type columns to query more accurately as I provided as example below.

    • As Microsoft docs mentioned here under "Trigger Limitations":

    CREATE TRIGGER must be the first statement in the batch and can apply to only one table.

    therefore we use EXECUTE to overcome this limitation:

    IF NOT EXISTS (select * from sys.objects where schema_id=SCHEMA_ID('dbo') AND type='TR' and name='Insert_WithdrawalCodes')
    BEGIN
       EXECUTE ('CREATE TRIGGER [Insert_WithdrawalCodes] ON [dbo].[PupilWithdrawalReason]
       AFTER INSERT
       AS 
       BEGIN
          SET NOCOUNT ON;
          ...
       END');
    END
    
    0 讨论(0)
  • 2021-01-01 09:16
    IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[TRIGGERNAME]'))
    DROP TRIGGER [dbo].[TRIGGERNAME]
    go
    IF  EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[TABLENAME]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
    BEGIN
    CREATE   TRIGGER [dbo].[TRIGGERNAME] ON [dbo].[TABLENAME] FOR INSERT, UPDATE 
    
    AS ...
    
    END
    

    Based on your updated question... try this:

    IF NOT EXISTS (select * from sys.objects where type = 'TR' and name = 'Insert_WithdrawalCodes')
    EXEC dbo.sp_executesql @statement = N'
    
    CREATE TRIGGER [dbo].[Insert_WithdrawalCodes] 
       ON  [dbo].[PupilWithdrawalReason] 
       AFTER INSERT
    AS 
    BEGIN
        SET NOCOUNT ON;
            UPDATE [dbo].[PupilWithdrawalReason] SET DateCreated=dbo.SYSTEMTIME() 
            WHERE WithdrawalCodeID IN (SELECT WithdrawalCodeID FROM inserted)
    END
    
    
     '
    
    0 讨论(0)
  • 2021-01-01 09:30

    The best way is to check for objects and drop them if they exist before you create them.

    Rather then not creating it at all if it exists, I would approach it the other way, drop it if exists and then create.

    Normally in long lenghty scripts if you want to update the definition of a trigger you would just simply add this at the end of that script and your trigger definition will be updated.

    So the approach should be create the object but drop it if it already exists rather then dont create it at all if it already exists

    IF OBJECT_ID ('[Insert_WithdrawalCodes] ', 'TR') IS NOT NULL
       DROP TRIGGER [Insert_WithdrawalCodes];
    GO
    
    CREATE TRIGGER .......
    
    0 讨论(0)
  • 2021-01-01 09:30

    Certain statements like CREATE TRIGGER needs to be the first in a batch (as in, group of statements separated by GO ).

    https://msdn.microsoft.com/en-us/library/ms175502.aspx

    Alternatively you could do this

    IF NOT EXISTS ( SELECT  *
                FROM    sys.objects
                WHERE   type = 'TR'
                        AND name = 'Insert_WithdrawalCodes' ) 
    BEGIN
        EXEC ('CREATE TRIGGER Insert_WithdrawalCodes ON ...');
    END;
    
    0 讨论(0)
提交回复
热议问题