2010-07-28 2 views
1

SQL CLR 트리거에서 트리거 재귀를 설정/해제하고 싶습니다. http://www.devx.com/tips/Tip/30031에 따르면 전화해야합니다SQL CLR 트리거 : 컨텍스트 DB의 이름

EXEC sp_dboption '<name of db>', 'recursive triggers', 'true'/'false' 

현재 DB 이름을 알 수있는 방법이 있습니까? 트리거를 만들 때 사용자에게 하나를 선택하라고 요청하지만 테이블에 쓰지 않으려 고합니다.

안부,

답변

1

는 SQLCLR 트리거 해고되고있는 데이터베이스의 이름을 찾을 수있는 아주 간단한 방법이있다. 당신은 심지어 쿼리를 실행할 필요가 없습니다 :-).

다음은 모든 SQLCLR 개체 유형에서 작동합니다

(저장 프로 시저, 함수, 사용자 정의 집계, 사용자 정의 유형 및 트리거) : 그것은

string _DatabaseName; 

using (SqlConnection _Connection = new SqlConnection("Context Connection = true;")) 
{ 
    _Connection.Open(); 
    _DatabaseName = _Connection.Database; 
} 

입니다! 방금 SQLCLR 트리거에서 시도하고 훌륭한 작동합니다.


다른 트리거를 발사 트리거를 제한하는 명심해야 할 또 다른 점은 TRIGGER_NESTLEVEL 기능입니다. 이 값은 @@PROCID 값을 사용할 수 있고 트리거의 [object_id]을 포함하는 T-SQL 트리거에서 더 잘 작동합니다. 따라서 T-SQL 트리거에서 개별 트리거의 재귀를 개별적으로 제한 할 수는 있지만 트리거가 다른 테이블의 다른 트리거를 시작할 수 있습니다.

SQLCLR에서는 여전히 트리거를 사용할 수 있지만 트리거의 이름이 없으면 모든 트리거를 제한 할 수 있습니다. 의미, 같은 테이블에 포함하여 모든 테이블에서 다른 트리거를 트리거 할 수 있지만 동일한 테이블을 포함하여 만 제한하는 방법은 없습니다.은 동일한 트리거를 수정하지만 다른 테이블에서는 트리거를 허용 할 수 있습니다. 문제의 트리거. 컨텍스트 연결을 사용하고 SELECT TRIGGER_NESTLEVEL();을 통해 SqlCommand.ExecuteScalar()을 실행하십시오.

1

당신은

CREATE TRIGGER etc 
.... 
GO 
DECLARE @db varchar(100) 
SET @db = DB_NAME() 
EXEC sp_dboption @db, 'recursive triggers', 'true'/'false' 
+0

예, 알지만 트리거는 CLR 어셈블리입니다. 안에 DB 이름을 전달하려면 테이블에 쓰고 트리거를 읽어야합니다. 어쨌든, 내가 이해하는 한, ''대신 DB_NAME()을 사용할 수 있습니다. 맞습니까? 아니면 변수를 선언해야합니까? – noober

+1

변수를 선언해야합니다. 또한 트리거 내부에서 작동하지 않을 수도 있습니다. – gbn

0

나는 더 나은 솔루션을 발견했습니다 ... 당신은 트리거를 만들 때 데이터베이스가 무엇인지.

EXEC sp_dboption을 호출하지 않아야합니다. 대신, "재귀 없음"플래그로 임시 테이블을 만든 다음 트리거가 시작될 때 기존 테이블을 확인하고 테이블이 존재하면 종료해야합니다.

왜 임시 테이블입니까?

  1. 세션이 끝날 때 사망합니다. 플래그를 재설정 할 필요가 없습니다 (예외적 인 경우). 그렇지 않으면 트리거가 영구적으로 꺼지는 것을 피하기 위해 필요합니다.
  2. AFAIK, 모든 연결에 대해 독립적으로 생성되고 제거됩니다. 따라서 사용자가 동시에 데이터를 변경하면 충돌이 발생하지 않습니다 (EXEC sp_dboption의 경우 불가피합니다). 다만 문맥 연결에 연결을하고 Database 속성을 가져 :