2012-06-23 5 views
0

와일드 카드를 사용하여 테이블 목록을 작성한 다음 트리거에 일부 열 이름을 추가하여 기존 트리거를 업데이트하려는 많은 트리거가 있습니다. 열 이름은 각 트리거에서 동일하지만 테이블의 목록을 작성하는 방법이나 단일 변경 트리거 문에서 목록을 반복하는 방법이 명확하지 않습니다. 나는 커서를 사용해야한다고 가정합니다.트리거를 일괄 처리하는 방법은 무엇입니까?

답변

1

"모든 트리거에 this code을 추가하십시오"(또는 그 밖의 다른 객체 유형) 마술 지팡이가 없습니다.

많은 개체 유형의 경우 일괄 편집의 경우 개체 탐색기 정보와 해당보기 내에서의 정렬 및/또는 필터링을 사용하여 여러 개체에 대한 스크립트를 신속하게 생성 할 수 있습니다. 예를 들어 개체 탐색기에서 "저장 프로 시저"를 강조 표시하면 개체 탐색기 정보에 모두 나열되고 여러 개체를 선택하고 마우스 오른쪽 단추로 클릭 한 다음 저장 프로 시저를 스크립트로 저장> CREATE To>

트리거 테이블 아래에 중첩 된 경우이 작업을 수행하는 편리한 방법이 없습니다 (데이터베이스를 마우스 오른쪽 단추로 클릭하고 작업> 스크립트 생성을 선택하면 엔터티 유형이 트리거되지 않습니다). 당신이 한 번 한 후, 복사 위쪽 창에 붙여 넣습니다

SET NOCOUNT ON; 

SELECT OBJECT_DEFINITION([object_id]) 
    + CHAR(13) + CHAR(10) + 'GO' + CHAR(13) + CHAR(10) 
    FROM sys.triggers 
    WHERE type = 'TR'; 

당신은 출력을 수행 할 수 있습니다하지만 당신은 (이 작업을 실행할 때 Management Studio에서 Results to Text을 할 것입니다) 아주 쉽게 메타 데이터에서 스크립트를 당길 수 각 트리거에 새 코드를 추가 한 경우 작업을 조금 더 수행해야합니다. 'ALTER TRIGGER'에 대해 'CREATE TRIGGER'을 검색/교체하십시오. 쿼리의 일부로이 작업을 수행 할 수도 있지만 일관된 코딩 규칙을 사용하는 작성자에게 의존합니다. 일부 트리거는 다음과 같을 수 있습니다. ...

create   trigger 

... 손으로 일부 마사지해야 할 수도 있습니다.

특정 테이블 집합에만 관심이있는 경우 위의 쿼리를 필터링 할 수도 있습니다. 예를 들어, 단지 Sales로 시작하는 테이블과 연관된 트리거를 변경하는 당신은 말할 수 :

AND OBJECT_NAME(parent_id) LIKE N'Sales%'; 

또는 단지 Person 스키마의 테이블 : 어쨌든

AND OBJECT_SCHEMA_NAME(parent_id) = N'Person'; 

을 당신이 필요한 모든 조정을 일단 스크립트, 그냥 실행할 수 있습니다. 모든 단일 테이블을 확장하고 해당 트리거에 대한 스크립트를 생성하는 것보다 훨씬 쉽습니다.

+0

Aaron 나는 당신의 제안을 좋아하고 메모장에서 함께 뭔가를 해킹 할 수있었습니다. ++ 어디서 코드 블록을 찾아 교체하고 교체해야하는지 알려줍니다. sys.triggers에서 선택한 항목이 실제로 도움이되었습니다. '일관된 코딩 규칙'과 같이 다루기 위해 와일드 카드를 추가 할 수 있습니다. 그러나 이전 게시물에서 조언을 얻었고 SP를 작성하여 나 자신 (및 다른 DB 개발자)이 장래에 일괄 편집을 자동화 할 수 있도록했습니다. – tpcolson

0

개체 이름 지정 규칙이 일관성없는 복잡한 트리거를 많이 사용하는 Aarons 제안 외에, 나는 3 개월 동안 내가 한 것을 기억할 수 있도록 뭔가를 요리하려고 시도했습니다. 즐겨. SP를 만들거나 변경 한 다음 매개 변수없이 실행합니다.

CREATE PROCEDURE SP_ALTER_CONTOUR_TRIGS 
--sp to bulk edit many triggers at once 
--NO ERROR HANDLING! 
AS 
    DECLARE 
     @sql VARCHAR(500), 
     @tableName VARCHAR(128), 
     @triggerName VARCHAR(128), 
     @tableSchema VARCHAR(128) 


    DECLARE triggerCursor CURSOR 
     FOR 
    SELECT 
     so_tr.name AS TriggerName, 
     so_tbl.name AS TableName, 
     t.TABLE_SCHEMA AS TableSchema 
    FROM 
     sysobjects so_tr 
    INNER JOIN sysobjects so_tbl ON so_tr.parent_obj = so_tbl.id 
    INNER JOIN INFORMATION_SCHEMA.TABLES t 
    ON 
     t.TABLE_NAME = so_tbl.name 
    WHERE 
    --here's where you want to build filters to make sure you're 
    --targeting the trigs you want edited 
    --BE CAREFUL! 
    --test the select statement first against sysobjects 
    --to see that it returns what you expect 
     so_tr.type = 'TR' 
     and so_tbl.name like '%contours' 
     and so_tr.name like'%location_id' 

    ORDER BY 
     so_tbl.name ASC, 
     so_tr.name ASC 

    OPEN triggerCursor 

    FETCH NEXT FROM triggerCursor 
    INTO @triggerName, @tableName, @tableSchema 

    WHILE (@@FETCH_STATUS = 0) 
     BEGIN 
--insert alter statement below 
--watch out for cr returns and open and close qoutes! 
--seems to act finicky if you don't use schema-bound naming convention 
SET @sql = ' 
ALTER TRIGGER ['+ @tableSchema +'].[' 
+ @triggerName + '] ON ['+ @tableSchema +'].[' 
+ @tableName + '] 
INSTEAD OF INSERT 
AS 
BEGIN 
SET NOCOUNT ON; 
INSERT ['+ @tableSchema +'].['+ @tableName + '] 
(OBJECTID, Contour, Type, Shape, RuleID, Override) 
SELECT 
a.OBJECTID, a.Contour, a.Type, a.Shape, a.RuleID, a.Override 
FROM 
(SELECT 
OBJECTID, Contour, Type, Shape, RuleID, Override 
FROM inserted) 
AS a 
END 
' 


      PRINT 'Executing Statement - '+ @sql 
      EXECUTE (@sql) 
      FETCH NEXT FROM triggerCursor 
      INTO @triggerName, @tableName, @tableSchema 
     END 

    CLOSE triggerCursor 
    DEALLOCATE triggerCursor 
관련 문제