2012-02-21 4 views
0

변경할 때 특정 열에서 업데이트를 트리거하려고합니다.변경시 특정 값으로 열을 강제 업데이트

(기록 : 일부 응용 프로그램은 열에 대한 업데이트를 수행하고 어떤 앱을 찾을 수 없으므로 값을 강제로 강제로 트리거하기로 결정했습니다). USR은 관리자가 어디 사람이 PWD에 업데이 트를 만드는 경우

, 나는이 특정 값으로 다시 업데이트 할

UsrTbl: 
usrid usr pwd 
1001 admin qwerty 
2001 cto demo 
3001 ceo demo 
... 

.. 간단하게합니다.

내가 트리거, 같은 것을 할 경우 :

CREATE TRIGGER the_usr_trg ON usrtbl AFTER UPDATE AS 
UPDATE usrtbl SET pwd='qwerty' WHERE usr = 'admin' 
GO 

나를 위해이 문제를 해결 위의 것? 트리거가 열을 업데이트하면 어떻게됩니까? the_usr_trg 트리거를 다시 발사 할 예정입니까? 이로 인해 데이터베이스 서버에서 루프가 발생합니까? 또는 한 번만 실행됩니까? 해결 방법이 더 좋습니까? (이 열을 업데이트하는 앱을 찾는 것 이외에 :)

고마워요!

+0

개발자 환경에서 수행하고 어떻게되는지 확인하십시오. – cadrell0

+0

비밀번호를 일반 텍스트로 저장하는 이유는 무엇입니까? 왜 'TRIGGER'안에 패스워드를 일반 텍스트로 저장하고 싶습니까? – JNK

+1

암호를 변경하지 않으려는 이유는 무엇입니까? 테이블에 저장하는 이유는 무엇입니까? –

답변

1

나는 그것이 DB에있는 트리거에 대한 재귀 수준에 따라 달라질 것이라고 생각합니다. RECURSIVE_TRIGGERSOFF으로 설정된 경우에는 한 번만 실행됩니다. 귀하의 경우에는 INSTEAD OF 트리거를 생성하면 테이블에 처음으로 UPDATE이 표시되는 것을 피하는 것이 더 좋을 것이라고 생각하십시오. 당신이 그들에게하지 않는 한 기본적으로

CREATE TRIGGER the_usr_trg ON usrtbl 
INSTEAD OF UPDATE 
AS 
BEGIN 

    UPDATE A 
    SET pwd= B.pwd 
    FROM usrtbl A 
    INNER JOIN INSERTED B 
     ON A.usr = B.usr 
    WHERE usr != 'admin' 

END 
1

트리거는 다음 문을 사용하여에 재귀 적으로 자신을 호출하지 않는 :

SET RECURSIVE_TRIGGERS ON 

귀하의 코드가 잘 작동합니다 귀하의 경우는 이런 일이 될 것입니다.

0

@ cadrell0의 설명에 따르면, 개발자 환경에서 테스트하여 재발 여부를 확인할 수 있습니다.

더 큰 문제는 시스템 원인 sys.trigger_events 또는 감사 테이블을 구현하는 것과 같은 근본 원인을 찾아내는 대신 값을 재설정하여 균열을 문서화하는 것입니다. 트리거를 사용하는 방법)을 사용하여 값이 변경되는시기와 이유를 확인합니다.

가 일반 텍스트로 암호를 저장하기 때문에 나쁘다는 사실을 무시 ...

는 변경 제안 참조하거나 트리거 업데이트를 사용하도록 삽입 테이블을 사용할 수 트리거에서 재귀를 방지하기 위해() 함수가 열이 변경되었는지 확인합니다. 열이 이미 원하는 값으로 설정된 경우 다시 열 필요가 없습니다.

관련 문제