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ń