Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CREATE TRIGGER is taking more than 30 minutes on SQL Server 2005

On our live/production database I'm trying to add a trigger to a table, but have been unsuccessful. I have tried a few times, but it has taken more than 30 minutes for the create trigger statement to complete and I've cancelled it.

The table is one that gets read/written to often by a couple different processes. I have disabled the scheduled jobs that update the table and attempted at times when there is less activity on the table, but I'm not able to stop everything that accesses the table.

I do not believe there is a problem with the create trigger statement itself. The create trigger statement was successful and quick in a test environment, and the trigger works correctly when rows are inserted/updated to the table. Although when I created the trigger on the test database there was no load on the table and it had considerably less rows, which is different than on the live/production database (100 vs. 13,000,000+).

Here is the create trigger statement that I'm trying to run

CREATE TRIGGER [OnItem_Updated] 
    ON  [Item]
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    IF update(State)
    BEGIN
        /* do some stuff including for each row updated call a stored 
          procedure that increments a value in table based on the 
          UserId of the updated row */
    END
END

Can there be issues with creating a trigger on a table while rows are being updated or if it has many rows?

In SQLServer triggers are created enabled by default. Is it possible to create the trigger disabled by default?

Any other ideas?

like image 970
Adam Porad Avatar asked Sep 20 '25 18:09

Adam Porad


2 Answers

The problem may not be in the table itself, but in the system tables that have to be updated in order to create the trigger. If you're doing any other kind of DDL as part of your normal processes they could be holding it up.

Use sp_who to find out where the block is coming from then investigate from there.

like image 78
Tom H Avatar answered Sep 22 '25 06:09

Tom H


I believe the CREATE Trigger will attempt to put a lock on the entire table.

If you have a lots of activity on that table it might have to wait a long time and you could be creating a deadlock.

For any schema changes you should really get everyone of the database.

That said it is tempting to put in "small" changes with active connections. You should take a look at the locks / connections to see where the lock contention is.

like image 45
DJ. Avatar answered Sep 22 '25 08:09

DJ.