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
Warto w takich skryptach zabezpieczać się przed niestandardowymi identyfikatorami. Sprawdź, co stanie się, gdy jedna z tabel będzie miała spację w nazwie...
OdpowiedzUsuńPodpowiedź: QUOTENAME.
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 :)
OdpowiedzUsuń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ź :)
@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:
OdpowiedzUsuńSELECT DISTINCT QUOTENAME(SCHEMA_NAME(T.[schema_id])) + '.' + QUOTENAME(T.name) ...
Wynik? Otoczone nawiasami kwadratowymi identyfikatory schematu i obiektu.
@C3PO: Racja, QUOTENAME to lepsze rozwiązanie.
OdpowiedzUsuń