2015-01-29 4 views
20

SQL Server 2008 R2를 사용하고 있습니다. Windows NT 6.1 (빌드 7601 : 서비스 팩 1)에서 Microsoft Corporation의 Standard Edition (64 비트)에 대한 자세한 내용은 Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) 2010 년 4 월 2 일 15:48:46) (하이퍼 바이저). 나는 SQL 서버 및 프로 시저/트리거를 처음 사용합니다. 나는 트리거를 만들려면 다음 코드를 (그것은 작동) : 트리거가 아직 존재하지 않는 경우트리거 문을 만들 때 "IF NOT EXISTS"를 추가하는 방법

CREATE TRIGGER [dbo].[Insert_WithdrawalCodes] 
    ON [dbo].[PupilWithdrawalReason] 
    AFTER INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 
     UPDATE [dbo].[PupilWithdrawalReason] SET DateCreated=dbo.SYSTEMTIME() 
     WHERE WithdrawalCodeID IN (SELECT WithdrawalCodeID FROM inserted) 
END 

어떻게 조건 만 만들려면 어떻게해야합니까? 여기서 내가 뭘 잘못하고 있니? Stackoverflow "존재하지 않는 경우"좋은 예제가 있지만 CREATE 함께 작동하도록 가져올 수 없습니다. 여기 내 실패의 노력 중 하나입니다

IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'TR' AND name = 'Insert_WithdrawalCodes') 
    exec('CREATE TRIGGER [dbo].[Insert_WithdrawalCodes] ON [dbo].[PupilWithdrawalReason] AFTER INSERT AS BEGIN SET NOCOUNT ON; UPDATE [dbo].[PupilWithdrawalReason] SET DateCreated=dbo.SYSTEMTIME() WHERE WithdrawalCodeID IN (SELECT WithdrawalCodeID FROM inserted) END') 
GO 
+0

내 fa를 업데이트했습니다. 예를 들어. "exec"코드가 작동하지 않는 이유는 무엇입니까? 작성시 내 구문이 잘못 되었습니까? – thebiggestlebowski

답변

47
IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[TRIGGERNAME]')) 
DROP TRIGGER [dbo].[TRIGGERNAME] 
go 
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[TABLENAME]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) 
BEGIN 
CREATE TRIGGER [dbo].[TRIGGERNAME] ON [dbo].[TABLENAME] FOR INSERT, UPDATE 

AS ... 

END 

create the object but drop it if it already exists해야한다 ...이 시도 :

IF NOT EXISTS (select * from sys.objects where type = 'TR' and name = 'Insert_WithdrawalCodes') 
EXEC dbo.sp_executesql @statement = N' 

CREATE TRIGGER [dbo].[Insert_WithdrawalCodes] 
    ON [dbo].[PupilWithdrawalReason] 
    AFTER INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 
     UPDATE [dbo].[PupilWithdrawalReason] SET DateCreated=dbo.SYSTEMTIME() 
     WHERE WithdrawalCodeID IN (SELECT WithdrawalCodeID FROM inserted) 
END 


' 
+0

"정말로 존재하지 않는다면"사용하고 싶습니다. 이 질문에는 "존재하지 않는다면"이 더 나은 이유를 설명하는 몇 가지 해답이 있습니다. http://stackoverflow.com/questions/937908/how-to-detect-if-a-stored-procedure-already-exists. – thebiggestlebowski

+1

질문에 변경된 내용을 반영하여 답변을 수정했습니다 ... – JStevens

+0

노력에 감사드립니다. 내가 그 코드를 시도하고 이것을 가지고 : 오류 SQL03070 :이 문맥은이 문맥에서 인식되지 않습니다. – thebiggestlebowski

9

가장 좋은 방법은 개체를 확인하고 당신이 그들을 작성하기 전에 존재하는 경우를 드롭하는 것입니다.

만약 존재한다면 그것을 전혀 만들지 말고, 다른 방법으로 접근하고, 존재한다면 그것을 버리고 다음으로 만듭니다.

일반적으로 긴 길이의 스크립트에서는 트리거의 정의를 업데이트하려는 경우이 스크립트의 끝에이 값을 추가하면 트리거 정의가 업데이트됩니다.

그래서 접근 방식보다는 업데이트 된 질문을 바탕으로 dont create it at all if it already exists

IF OBJECT_ID ('[Insert_WithdrawalCodes] ', 'TR') IS NOT NULL 
    DROP TRIGGER [Insert_WithdrawalCodes]; 
GO 

CREATE TRIGGER ....... 
+0

"정말로 존재하지 않는다면"사용하고 싶습니다. 이 질문에는 "존재하지 않는다면"이 더 나은 이유를 설명하는 몇 가지 해답이 있습니다. http://stackoverflow.com/questions/937908/how-to-detect-if-a-stored-procedure-already-exists. – thebiggestlebowski

+0

설명을 찾는 사람들에게 :'존재하지 않는다면'객체가 참으로 트리거인지를 확인할 수 있습니다. –

4

특정 문이 트리거가 될 필요가 CREATE 좋아 일괄 처리에서 처음으로 (GO로 구분 된 명령문 그룹에서와 같이). 저장 프로 시저, 기능을 위해 존재하는 경우 또한 아래 링크를 클릭하여 트리거

를 들어
IF EXISTS (SELECT * FROM sys.objects WHERE [name] = 
       N'[Trigger_Name]' AND [type] = 'TR') 
BEGIN 
DROP TRIGGER [Trigger_Name] 
Print('Trigger dropped => [Schema].[Trigger_Name]') 
END 
GO 

확인 존재하는 경우

https://msdn.microsoft.com/en-us/library/ms175502.aspx

는 다른 방법이

IF NOT EXISTS (SELECT * 
      FROM sys.objects 
      WHERE type = 'TR' 
        AND name = 'Insert_WithdrawalCodes') 
BEGIN 
    EXEC ('CREATE TRIGGER Insert_WithdrawalCodes ON ...'); 
END; 
+0

나는 이것을 시도했지만 작동하지 않았다. 내 질문을 작동하지 않는 코드로 업데이트 할 것이다. 왜 작동하지 않는지 확인할 수 있다면 좋을 것이다. http://stackoverflow.com/questions/937908/how-to-detect-if-a-stored-procedure-already-exists. – thebiggestlebowski

+0

EXEC() 다음에 세미콜론이 누락되었습니다. 이 EXEC ('CREATE TRIGGER [dbo]. [Insert_WithdrawalCodes] ON [dbo]. [PupilWithdrawalReason] INSERT 후에 BEGIN SET NO COUNT ON, UPDATE [dbo]. [PupilWithdrawalReason] SET DateCreated = dbo.SYSTEMTIME() WHERE WithdrawalCodeID IN SELECT WithdrawalCodeID FROM이 삽입 됨) END '); – Neel

+0

감사합니다. – thebiggestlebowski

관련 문제