복붙노트

[SQL] 데이터베이스 트리거 악이 있습니까? [닫은]

SQL

데이터베이스 트리거 악이 있습니까? [닫은]

데이터베이스 트리거는 나쁜 생각이 있습니까?

내 경험에 의하면 그들은 부작용을 놀라게 초래할 수 있기 때문에, 악, 및 디버그 (하나의 트리거가 서로를 발사 특히)에 어렵다. 종종 개발자는 심지어 트리거가 있는지 찾고 생각하지 않습니다.

반면에, 당신이 evertime 새로운 FOO가 데이터베이스에 작성됩니다 발생해야 논리가있는 경우 다음 가장 절대 안전한 장소가이 FOO 테이블에 삽입 트리거입니다 넣어처럼 보인다.

우리가 트리거를 사용하는 유일한 시간은 ModifiedDate를 설정하는 등의 정말 간단한 일입니다.

해결법

  1. ==============================

    1.트리거의 주된 문제는

    트리거의 주된 문제는

    이 단지 그들이 조심스럽게 적절한 상황에 사용되는 필요 의미한다 내 경험에있는은 (때로는 선언적으로 얻을 수있는 것보다 더 정밀한 세분화와) 관계 무결성 문제로 제한됩니다; 일반적으로하지 비즈니스 트랜잭션을 위해. YMMV.

  2. ==============================

    2.아니, 그들은 실제로 좋은 생각입니다. 특정 트리거에 문제가 있다면, 당신은 바로 그 일을하지 않는,하지만 일반적으로 구현의 문제가 아니라 트리거 자신 :-)의 개념이 의미합니다.

    아니, 그들은 실제로 좋은 생각입니다. 특정 트리거에 문제가 있다면, 당신은 바로 그 일을하지 않는,하지만 일반적으로 구현의 문제가 아니라 트리거 자신 :-)의 개념이 의미합니다.

    그것이 속해있는 데이터베이스의 제어하에 DBMS 고유의 활동을 배치 때문에 우리는 트리거 큰 거래를 사용합니다. DBMS의 사용자는 재료의 종류에 대해 걱정할 필요가 없습니다합니다. 데이터베이스 자체가 아닌 응용 프로그램 또는 그것을 사용하는 사용자와 데이터 거짓말의 무결성. 데이터베이스의 제약과 트리거 및 기타 기능없이, 규칙을 적용 할 수있는 응용 프로그램을 왼쪽으로 만 데이터를 파괴하는 하나 개의 불량이나 버그 응용 프로그램 / 사용자가 필요합니다.

    예를 들어, 트리거없이, 자동으로 생성 된 열이 같은 놀라운 일이없는 것입니다 그리고 당신은 그들을 선택할 때 각 행에 기능을 처리해야 할 것이다. 즉 그게 변경하는 유일한 시간이기 때문에 삽입 / 업데이트시 자동으로 생성 된 열을 만드는 데 훨씬 더 나은, DBMS 성능을 죽일 가능성이 높습니다.

    또한, 열이 특정 형식을 보장하는 등의 사전 트리거로 DBMS에 적용되는 데이터 규칙을 방해하는 트리거의 부족. 참고이 일반적으로 단지 외래 키 모양의 업입니다 데이터 무결성 규칙 다르다는 것을.

  3. ==============================

    3.도구는 악을 결코 없습니다. 이러한 도구의 응용 프로그램은 악이 될 수 있습니다.

    도구는 악을 결코 없습니다. 이러한 도구의 응용 프로그램은 악이 될 수 있습니다.

  4. ==============================

    4.나는 동의한다. 트리거에 문제는 사람이 아니라 트리거입니다. 더 고려하는,보고 더와 코더가 제대로 일을 확인에 무거운 짐이 증가하지만, 우리는 우리의 삶을 간단하게 할 수 없습니다 폐기 색인을한다. (잘못된 인덱스는 나쁜 트리거 나쁜로 할 수있다)

    나는 동의한다. 트리거에 문제는 사람이 아니라 트리거입니다. 더 고려하는,보고 더와 코더가 제대로 일을 확인에 무거운 짐이 증가하지만, 우리는 우리의 삶을 간단하게 할 수 없습니다 폐기 색인을한다. (잘못된 인덱스는 나쁜 트리거 나쁜로 할 수있다)

    (내 마음 속에) 트리거의 중요성은 그입니다 ... - 모든 시스템은 항상 유효한 상태에 있어야합니다 - 코드는이 유효한 상태는 중앙 (모든 SP에 기록되지 않음)해야한다 집행

    보기의 유지 보수 관점에서, 트리거 유능한 코더 더 주니어 / 아마추어들에 대한 문제에 매우 유용합니다. 그러나,이 사람들은 배우고 어떻게 든 성장해야합니다.

    나는 당신의 작업 환경에 내려 오는 것 같아요. 당신은 잘 배우고 신뢰할 수있는 사람들이 조직적으로 신뢰할 수 있습니까? 그렇지 않으면 당신은 겉으로는 두 가지 선택이있다 : - 당신이 보상 기능을 상실 할 것이라는 점에 동의 - 당신이 다른 사람 또는 더 나은 교육과 관리가 필요하다고 동의

    그들은 거친 소리, 그리고 나는 그들이 있다고 생각한다. 하지만 내 마음에, 기본적인 진실 ...

  5. ==============================

    5.나는 트리거 재앙이 아니라,하지만 좋은 데이터베이스 설계에 필요한뿐만 아니라 생각합니다. 응용 프로그램 프로그래머는 데이터베이스는 자신의 응용 프로그램에 의해 영향을받는 것으로 생각합니다. 그들은 종종 잘못이다. 데이터 무결성은 데이터 변경의 출처에 상관없이 유지 될 경우, 트리거는 요구 사항이며, 어떤 프로그래머가 자신의 소중한 응용 프로그램이 일에 영향을 미칠 수보다 다른 무언가를 고려하는 것이 너무 자 민족 중심이기 때문에이를 방지하기 위해 어리석은 것입니다. 디자인하거나 테스트 또는 당신이 유능한 데이터베이스 개발자의 경우 트리거를 해결하기 어렵지 않다. 도 아니다 (그것은 나에게처럼)이보고 당신에게 발생하는 경우 트리거가 예기치 않은 결과를 유발하는 것이 어렵다. 나는 내 SP에서 FK 오류가 있습니다 참조 아니에요 테이블을 말하는 오류가 발생하는 경우, 그 트리거가해야 유능한 데이터베이스 개발자 그래서 문제의 원인이되고 그것에 대해도 생각없이 알고있다. 다른 규칙도 존재한다는 생각이 자신의 프로세스에서이를 위반으로 내가 잘못된 데이터의 발견 원인은 응용 프로그램에서 비즈니스 규칙을 두는 것은 숫자입니다. 데이터 중심의 규칙은 데이터베이스에 속하고 트리거는 더 복잡한 것들을 시행 열쇠입니다.

    나는 트리거 재앙이 아니라,하지만 좋은 데이터베이스 설계에 필요한뿐만 아니라 생각합니다. 응용 프로그램 프로그래머는 데이터베이스는 자신의 응용 프로그램에 의해 영향을받는 것으로 생각합니다. 그들은 종종 잘못이다. 데이터 무결성은 데이터 변경의 출처에 상관없이 유지 될 경우, 트리거는 요구 사항이며, 어떤 프로그래머가 자신의 소중한 응용 프로그램이 일에 영향을 미칠 수보다 다른 무언가를 고려하는 것이 너무 자 민족 중심이기 때문에이를 방지하기 위해 어리석은 것입니다. 디자인하거나 테스트 또는 당신이 유능한 데이터베이스 개발자의 경우 트리거를 해결하기 어렵지 않다. 도 아니다 (그것은 나에게처럼)이보고 당신에게 발생하는 경우 트리거가 예기치 않은 결과를 유발하는 것이 어렵다. 나는 내 SP에서 FK 오류가 있습니다 참조 아니에요 테이블을 말하는 오류가 발생하는 경우, 그 트리거가해야 유능한 데이터베이스 개발자 그래서 문제의 원인이되고 그것에 대해도 생각없이 알고있다. 다른 규칙도 존재한다는 생각이 자신의 프로세스에서이를 위반으로 내가 잘못된 데이터의 발견 원인은 응용 프로그램에서 비즈니스 규칙을 두는 것은 숫자입니다. 데이터 중심의 규칙은 데이터베이스에 속하고 트리거는 더 복잡한 것들을 시행 열쇠입니다.

  6. ==============================

    6.대부분, 예.

    대부분, 예.

    트리거와 어려움은 "뒤로"물건을 수행한다는 것입니다; 쉽게 실현할 수없는 응용 프로그램을 유지하는 개발자도 모르게 물건을 나사가와 메이크업을 변경합니다.

    그것은 단지 유지 보수 작업을 추가 복잡성의 레이어를 생성합니다.

    오히려 트리거, 저장 프로 시저 / 루틴을 사용하는 것보다 일반적으로 같은 일을 만들었지 만, 명확하고 유지 관리 방법으로 할 수 있습니다 - 개발자가 소스 코드를보고 무슨 일이 일어나고 정확히 볼 수있는 저장 루틴 수단을 호출.

  7. ==============================

    7.트리거는 트리거가 문제에 대한 최상의 솔루션 시나리오의 숫자가 매우 강력하고 유용합니다.

    트리거는 트리거가 문제에 대한 최상의 솔루션 시나리오의 숫자가 매우 강력하고 유용합니다.

    그들은 또한 매우 좋은 "해킹"도구입니다. 당신은 코드와 데이터베이스 모두의 즉각적인 통제에 있지 않은 경우가 종종있다. 당신은 당신의 코드의 다음 주요 릴리스 2 개월 기다려야한다, 그러나 당신이 당신의 데이터베이스에 패치를 적용 할 수있는 경우 즉시 당신은 몇 가지 추가 기능을 수행하기 위해 테이블에 트리거를 넣을 수 있습니다. 코드 릴리스가 가능하다 그런 때 원하는 경우에는 동일한 기능의 당신의 코드 버전이 트리거를 대체 할 수 있습니다.

    당신이 무엇을하고 있는지 모르는 경우 하루의 끝에서, 모든 "악의"입니다. 트리거를 이해하지 못하는 개발자가 있기 때문에 것을 결정하는 것은 어떤 사람들은 운전 할 수 없기 때문에 자동차가 악이라고 주장과 동일합니다 ...

  8. ==============================

    8.트리거는 자신의 용도가 - 로그 / 감사 및 이전 답변에서 언급 한 두 가지 아주 좋은 용도는 "마지막으로 수정 한"날짜를하는 유지한다.

    트리거는 자신의 용도가 - 로그 / 감사 및 이전 답변에서 언급 한 두 가지 아주 좋은 용도는 "마지막으로 수정 한"날짜를하는 유지한다.

    그러나, 좋은 디자인의 핵심 신조 중 하나는 당신이 한 장소에 집중해야 전화를 원하는 그 비즈니스 규칙 / 비즈니스 로직은 /입니다. (트리거 또는 저장 발동를 통해) 데이터베이스의 논리의 일부를 퍼팅과 응용 프로그램의 일부는 그 원칙을 위반하는 것입니다. 두 곳의 논리를 복제하는 것은 그들이 변함없이 서로 동기화되지 얻을 것이다으로, 더 나쁜 것입니다.

    이미 언급 된 문제은 "적어도 깜짝 원칙"도 있습니다.

  9. ==============================

    9.적절하게 사용하는 경우 트리거는 좋은 도구이다. 특히 등 감사의 변화 같은 것들, 채우기 요약 테이블에 대한

    적절하게 사용하는 경우 트리거는 좋은 도구이다. 특히 등 감사의 변화 같은 것들, 채우기 요약 테이블에 대한

    당신은 하나의 트리거로 "트리거 지옥"에 끝날 경우, 이제 그들은 "악"이 될 수있는 다른 트리거 개막하는. 그들은 이른바했다 어디 한 번 COTS 제품에 근무 "플렉스 트리거를." 동적 SQL 따가워 그들이 실행 된 때마다 컴파일 된대로이 트리거는 테이블에 저장되었습니다. 컴파일 된 트리거는보고를 수행하고 해당 테이블을 실행 한 후 컴파일하고 "플렉스"트리거를 실행할 수있는 플렉스 트리거가 있다면 볼 것입니다. 이론적으로 제품을 쉽게 사용자 정의 되었기 때문에 이것은 정말 멋진 생각처럼 소리하지만 현실은 꽤 많이해야했던 모든 컴파일로 인해 폭발 데이터베이스이었다 ...

    그래서 그래, 그들은있는 거 좋은 당신은 당신이 관점에서 무슨 일을하는지 계속합니다. 그것이 등 감사 요약하면, 자동 염기 서열, 아니 확률값과 같이 아주 간단합니다. 그냥 마음에 성장 테이블의 속도와 트리거가 성능에 영향을 미칠 방법을 유지한다.

  10. ==============================

    10.높은 수준에서 triggers1 두 가지 사용 사례가있다

    높은 수준에서 triggers1 두 가지 사용 사례가있다

    1) 물건을 "자동적으로"일어날 수 있도록합니다. 부작용의 원인이 경우, 트리거, 그들은 (프리미티브) 연산자 삽입, 업데이트 또는 특정 실행 된 삭제 화재로 인한 트리거를 예상되지 된 방법으로 데이터를 변경.

    여기에 일반적인 합의가 트리거가 실제로 해로운 것입니다. 그들은는 INSERT, UPDATE 또는 DELETE 문의 잘 알려진 의미를 변경할 수 있기 때문에. 이 세 가지 기본 SQL 사업자의 의미를 변경하면 다른 개발자 물린 누가 나중에 SQL 프리미티브로에 작동 할 때 더 이상 기대 방식으로 행동하지 않는 데이터베이스 테이블에 작업에 대한 미래의 필요한다.

    2) 우리는 선언적 (CHECK, PRIMARY KEY, UNIQUE KEY 및 FOREIGN KEY)를 이용하여 처리 할 수있는 것보다 다른 데이터 무결성 규칙을 적용합니다. 모든 트리거 할 본 유스 케이스에서는 INSERT / UPDATE 의해 제조되고 변경 / DELETE가 허용되지 않은 경우 QUERY (SELECT) 데이터를 검증하는 것이다. 그냥 선언적 제약처럼 우리를 위해 않습니다. 단,이 경우 우리 (개발자)의 시행을 프로그래밍 한.

    후자의 사용 사례에 대한 트리거를 사용하여 유해하지 않습니다.

    http://harmfultriggers.blogspot.com : 난에 그에서 블로깅을하고있어

  11. ==============================

    11.나는 그들이 원하는 기능을 달성하는 가장 직접적인 방법입니다 트리거가 항상 사용되어야한다고 생각 개발자, 결코 개발자를 알고있다. 그것은 거의 두 진영 사이의 교리 같다.

    나는 그들이 원하는 기능을 달성하는 가장 직접적인 방법입니다 트리거가 항상 사용되어야한다고 생각 개발자, 결코 개발자를 알고있다. 그것은 거의 두 진영 사이의 교리 같다.

    그러나 나는 개인적으로 완전히 MarkR에 동의 - 당신이 할 수있는 (거의) 더 명쾌한하고 유지하는 것이 더 쉬울 것이다 트리거와 동일한 기능을 항상 쓰기 코드입니다.

  12. ==============================

    12.악하지 않습니다. 같은 그들은 실제로 단순화 일

    악하지 않습니다. 같은 그들은 실제로 단순화 일

    기록 또는 데이터베이스 스키마에 대한 변경의 1.Logging / 감사

    롤 프로덕션 환경에 변화를 백업하는 것이 당신은 ALTER TABLE에 트리거를 가질 수있다. 이것은 어떤 실수로 테이블 변경을 방지해야한다.

    여러 데이터베이스에서 참조 무결성 (기본 / 외래 키 관계 등) 2.Enforcing

  13. ==============================

    13.아니, 그들은 악마 아니에요 - 그들은있는 거 그냥 오해 - D

    아니, 그들은 악마 아니에요 - 그들은있는 거 그냥 오해 - D

    트리거는 올바른 사용을 가지고 있지만 너무 자주 레트로 해킹과 같은 것을 궁극적으로 상황을 악화 있습니다.

    당신이 응용 프로그램의 일환으로 DB를 개발하는 경우 논리는 항상 코드 또는 호출을 sprocs가에 있어야합니다. 트리거는 나중에 디버그 고통으로 이어질 것입니다.

    당신은 잠금 교착 어떻게 DB에 액세스 파일을 디스크에 다음 정말 도움이 될 수 있습니다 (예 : 감사 또는 직접 DB 액세스를 보관하기위한) 올바른 방법으로 트리거를 사용하는 방법을 이해합니다.

  14. ==============================

    14.그들은 악마가 exageration입니다하지만 그들이 메쉬 일으킬 수 있다고합니다. 하나의 트리거의 소성 화재로 다른 트리거가 발생하면 정말 복잡해진다. 하자 그들이 골치 말 : http://www.oracle.com/technology/oramag/oracle/08-sep/o58asktom.html

    그들은 악마가 exageration입니다하지만 그들이 메쉬 일으킬 수 있다고합니다. 하나의 트리거의 소성 화재로 다른 트리거가 발생하면 정말 복잡해진다. 하자 그들이 골치 말 : http://www.oracle.com/technology/oramag/oracle/08-sep/o58asktom.html

    트리거와 오라클의 비즈니스 로직을 수행하면이 때문에 멀티 동시성 문제의 것보다 어렵습니다. 당신은 다른 세션 커밋 될 때까지 다른 세션의 변화를 볼 수 없습니다.

  15. ==============================

    15.그들은 확실히 악이 아니다. (이름 / 성 케이스 예) 전이를 지원 두 열 또는 그 역으로 열 또는 분할 칼럼의 이름을 변경하는 동안은 데이터베이스 스키마 리팩토링 중에 귀금속 트리거 알았다.

    그들은 확실히 악이 아니다. (이름 / 성 케이스 예) 전이를 지원 두 열 또는 그 역으로 열 또는 분할 칼럼의 이름을 변경하는 동안은 데이터베이스 스키마 리팩토링 중에 귀금속 트리거 알았다.

    그들은 또한 감사에 매우 유용합니다.

  16. ==============================

    16.이 답변은 SQL Server에 구체적으로 적용됩니다. (그것은 또한 다른 RDBMS에 적용 할 수 있지만 나도 몰라. 내가 여기 답변으로 제공하기 위해 선호했을하지만이의 잘 속는 사람으로 폐쇄되었습니다.)

    이 답변은 SQL Server에 구체적으로 적용됩니다. (그것은 또한 다른 RDBMS에 적용 할 수 있지만 나도 몰라. 내가 여기 답변으로 제공하기 위해 선호했을하지만이의 잘 속는 사람으로 폐쇄되었습니다.)

    답변의에 언급되지 않은 한 측면은 지금까지 보안입니다. 기본적으로 트리거는 모든 트리거 검토하지 않는 한이 보안 위협이 발생할 수 있습니다 트리거를 발생시킨 명령문을 실행하는 사용자의 컨텍스트에서 실행하기 때문에.

    은 "트리거 보안 관리"를 제목 아래 BOL에 주어진 예제 코드 GRANT CONTROL 서버에 JohnDoe에 포함 된 트리거를 생성하는 사용자입니다; 위해 자신의 권한을 확대합니다.

  17. ==============================

    17.부작용이있는 경우에는 설계 상 문제가 있습니다. 일부 데이터베이스 시스템에서, 기본 키 ID 필드에 대한 필드, 즉 자동 증가를 설정하는 다른 가능성이 없다.

    부작용이있는 경우에는 설계 상 문제가 있습니다. 일부 데이터베이스 시스템에서, 기본 키 ID 필드에 대한 필드, 즉 자동 증가를 설정하는 다른 가능성이 없다.

  18. ==============================

    18.나는 그들이 악을 할 수 있다고 생각하지만 악으로 개발 아무것도있다.

    나는 그들이 악을 할 수 있다고 생각하지만 악으로 개발 아무것도있다.

    정말 그들과 함께 많은 경험을 가지고 있지 않지만 내가하는 일 최근 프로젝트를 했는가하면이 결론에 저를 이끌어있다. 내가 그들과 함께있는 문제는 그들이 비즈니스 논리는 두 위치, 코드 라이브러리 및 데이터베이스에서 종료 될 수있다.

    나는 sprocs가를 사용하여와 유사한 인수로 참조하십시오. 사람들이 다른 곳에서 자신의 비즈니스 로직을하지 않습니다 동안 종종 데이터베이스로 SQL 작성 비즈니스 로직 정말 좋은 개발자를해야합니다.

    내 경험 법칙 그래서 프로젝트의 구조가 무엇인지 봐입니다. 이 데이터베이스에 저장된 비즈니스 로직을 가지고 실행 가능한 것 같으면 다음은 트리거가있는 것이 유용 할 수 있습니다.

  19. ==============================

    19.사실, 자주 트리거가 오용되고있다. 사실 대부분의 경우에 당신도 그들을 필요로하지 않습니다. 그러나 그들이 반드시 나쁜하지 않습니다.

    사실, 자주 트리거가 오용되고있다. 사실 대부분의 경우에 당신도 그들을 필요로하지 않습니다. 그러나 그들이 반드시 나쁜하지 않습니다.

    당신이 소스 코드가없는 그것을 변경할 수있는 방법이 없기하는 기존 응용 프로그램이있을 때 트리거가 유용 어디에 내 마음에 오는 시나리오입니다.

  20. ==============================

    20.트리거의 아이디어 트리거의 중첩 제한하는 것은 악, 악이 아니다.

    트리거의 아이디어 트리거의 중첩 제한하는 것은 악, 악이 아니다.

  21. from https://stackoverflow.com/questions/460316/are-database-triggers-evil by cc-by-sa and MIT license