piątek, 18 lutego 2011

DISABLE TRIGGERS

Nie lubię Triggerów...

Poniżej prosty skrypt do wyłączania wszystkich Triggerów DML na tabelach użytkownika.
DECLARE @NAME VARCHAR(8000)

DECLARE TR_CURSOR CURSOR STATIC FOR
    SELECT DISTINCT SCHEMA_NAME(T.[SCHEMA_ID]) + '.' + T.NAME 
    FROM SYS.TRIGGERS AS TR
        INNER JOIN SYS.TABLES AS T ON TR.PARENT_ID = T.[OBJECT_ID]
    WHERE TR.PARENT_CLASS = 1

OPEN TR_CURSOR

FETCH NEXT FROM TR_CURSOR 
INTO @NAME

WHILE @@FETCH_STATUS = 0
    BEGIN

        EXECUTE('DISABLE TRIGGER ALL ON ' + @NAME)

        FETCH NEXT FROM TR_CURSOR 
        INTO @NAME
    END 

CLOSE TR_CURSOR
DEALLOCATE TR_CURSOR

4 komentarze:

  1. Warto w takich skryptach zabezpieczać się przed niestandardowymi identyfikatorami. Sprawdź, co stanie się, gdy jedna z tabel będzie miała spację w nazwie...

    Podpowiedź: QUOTENAME.

    OdpowiedzUsuń
  2. Fakt. Przydałoby się opakować nazwy identyfikatorów w nawiasy kwadratowe. Człowiek z przyzwyczajenia tego nie robi, bo sam nie stosuję spacji w nazwach :)
    Muszę też przyznać, że nigdy nie użyłem funkcji QUOTENAME. Raczej zamieniłbym pierwszą linijkę deklaracji kursora na

    SELECT DISTINCT '[' + SCHEMA_NAME(T.[SCHEMA_ID]) + '].[' + (T.NAME) + ']'

    Dzięki za podpowiedź :)

    OdpowiedzUsuń
  3. @Krzysztof: QUOTENAME jest ciut lepszym rozwiązaniem niż "ręczne" otaczanie nawiasami identyfikatorów. Sprawdź, co będzie, jak w nazwie tabeli pojawi się znaczek ] (zamknięcie nawiasu kwadratowego) :-) Użycie QUOTENAME wyglądałoby tak:

    SELECT DISTINCT QUOTENAME(SCHEMA_NAME(T.[schema_id])) + '.' + QUOTENAME(T.name) ...

    Wynik? Otoczone nawiasami kwadratowymi identyfikatory schematu i obiektu.

    OdpowiedzUsuń
  4. @C3PO: Racja, QUOTENAME to lepsze rozwiązanie.

    OdpowiedzUsuń