2012-11-29 5 views
1

나는 동적으로 두 개의 데이터베이스를 통해 트리거의 수를 만들려고하고 있지만이 문을 실행하면 내가 얻을 데이터베이스동적, 크로스 데이터베이스 트리거 생성

SET @SQL = 'SELECT Name FROM ' + @DB + '.sys.triggers WHERE Name = ' + '''' 
      + @Table + '_DELTATrigger' + '''' 
EXEC(@SQL) 

IF @@RowCount > 0 
BEGIN 
    SET @SQL = 'USE ' + @DB + '; DROP TRIGGER [dbo].[' + @Table + '_DELTATrigger]' 
    EXEC(@SQL) 
END 

SET @SQL = 'CREATE TRIGGER [dbo].[' + @Table + '_DELTATrigger] 
       ON [dbo].[' + @Table + '] 
       AFTER INSERT, UPDATE 
       AS 
       BEGIN 
        SET NOCOUNT ON 
        UPDATE [' + @Table + '] 
        SET [Delta] = 1 
        FROM inserted 
        WHERE inserted.[ID] = [' + @Table + '].[ID] 
       END;'    
EXEC (@SQL) 

을 전환 할 때 내가 만들기 트리거 문에 문제가 있어요

문제 다음과 같은 오류 8197, 수준 16, 상태 4, 절차 tblBuild_DataPlate_DELTATrigger, 줄 1
메시지 : 개체 'dbo.tblBuild_DataPlate는'이 (가) 또는 INVA하지 않습니다 이 작업을위한 뚜껑.

동적대로 작동하지 않습니다 USE 문을 포함하는 트리거를 작성 변경 트리거 당신은 완전히이 경우 데이터베이스와 객체를받을 수 없습니다

SET @SQL = 'USE ' + @DB + '; CREATE TRIGGER [dbo].[' + @Table + '_DELTATrigger] 
      ON [dbo].[' + @Table + '] 
      AFTER INSERT, UPDATE 
      AS 
      BEGIN 
       SET NOCOUNT ON 
       UPDATE [' + @Table + '] 
       SET [Delta] = 1 
       FROM inserted 
       WHERE inserted.[ID] = [' + @Table + '].[ID] 
      END;'    
EXEC (@SQL) 

Error 111, Level 15, State 1, Procedure -, 
Line 1, Message: 'CREATE TRIGGER' must be the first 
statement in a query batch. 

첫 번째 문을이어야 만들기 다음과 같은 오류

오류 166, 수준 15, 상태 1, 프로 시저 얻을으로 -, 줄 1,
메시지 : '/ ALTER를 만들 TRIGGER '는 데이터베이스 이름을 오브젝트 이름의 접 두부로 지정하는 을 허용하지 않습니다.

동적 인 방법이 있습니까?

+0

당신이 트리거를 만들 시도해 봤어 '+ DBNAME +' [dbo]. [+ + 테이블 + '_DELTATrigger]? –

+0

예. 위의 세 번째 오류가 발생하면 Create Trigger 쿼리에 DB 접두사를 사용할 수 없습니다. –

답변

3

, 당신은 rigth 장소에 트리거를 만들 수있는이와 있으므로이 코드는 다음, 선택한 데이터베이스 (@DB)에 sp_executesql를 실행합니다 :

SET @SQL = 'EXEC ' + @DB + '..sp_executesql N'' 
CREATE TRIGGER [dbo].[' + @Table + '_DELTATrigger] 
          ON [dbo].[' + @Table + '] 
          AFTER INSERT, UPDATE 
         AS 
         BEGIN 
          SET NOCOUNT ON 

         END;'''    
      EXEC (@SQL) 
+0

감사합니다 Andras, 그 작동합니다 –