2009-11-26 3 views
0

두 개 이상의 업데이트 트리거가있는 테이블을 모두 선택할 수 있습니까? 다음 코드는 두 개 이상의 트리거가있는 모든 테이블을 선택하지만 두 개 이상의 업데이트 트리거가있는 테이블 만 필요합니다. 이 쿼리는 하나의 삽입 트리거와 하나의 업데이트 트리거가있는 테이블도 반환합니다. 이는 원하는 것과 다릅니다.두 개 이상의 업데이트 트리거가있는 모든 테이블을 선택할 수 있습니까

SELECT * FROM sys.triggers 
WHERE parent_id IN(SELECT parent_id 
FROM sys.triggers 
GROUP BY parent_id 
HAVING COUNT(*)>1) 

답변

3

당신은 sys.trigger_events에서이 문제를 말할 수 있어야 예 :

SELECT OBJECT_NAME(parent_id) 
    FROM sys.triggers AS t 
    INNER JOIN sys.trigger_events AS te 
    ON t.[object_id] = te.[object_id] 
    WHERE te.type_desc = 'UPDATE' 
    GROUP BY OBJECT_NAME(parent_id) 
    HAVING COUNT(*) > 1; 
+0

이것은 효과적입니다. 아론 감사합니다! –

0

믿을 수는 없지만 빠르고 더러운 것이 필요한 경우 작동해야합니다.

SELECT * FROM sys.triggers 
WHERE parent_id IN 
(SELECT parent_id 
FROM sys.triggers tt 
JOIN sys.syscomments sc on sc.id=tt.object_id 
WHERE sc.text LIKE '%AFTER UPDATE%' 
GROUP BY parent_id 
HAVING COUNT(*)>1) 
+0

이 매우 효율적되지 않습니다 : 그래서

SELECT * FROM sys.trigger_events AS te INNER JOIN sys.triggers AS t ON t.[object_id] = te.[object_id] WHERE te.[type] IN (1,2,3); 

하나 이상의 업데이트 트리거 테이블을 얻을하는 방법 , "AFTER UPDATE"("FOR UPDATE"라고 말할 수도 있음)를 사용하고 syscomments를 사용하면 "AFTER UPDATE"또는 "FOR UPDATE"가 8000 자의 문자를 넘어서서 실제로 나타나지 않을 위험이 있습니다 이 객체 정의의 시작 부분에 매우 가깝기 때문에 나타납니다). 이 정보는 메타 데이터/카탈로그 뷰에서 사용할 수 있으므로 무차별 대입 구문 분석을 사용하지 않고도 이러한 정보를 확인할 수 있습니다. –

+0

추신 : sys.syscomments (이전 버전과의 호환성을 위해 제공되며 언젠가는 사용되지 않음)와 관련된 문제를 피하려면 sys.sql_modules (8KB로 제한되지 않는 정의 열이 있음) 및 OBJECT_DEFINITION 함수에 익숙해지는 것이 좋습니다. –

+0

일회용으로 필요한 것이 있으면 빠르며 더러운 것입니다. 나는 당신의 해결책을 더 좋아합니다 ... – Sparky

관련 문제