programing

데이터베이스 트리거가 필요합니까?

newstyles 2023. 9. 11. 21:32

데이터베이스 트리거가 필요합니까?

제 경험으로는 놀라운 부작용을 초래할 수 있고 디버그하기도 어렵기 때문에(특히 한 트리거가 다른 트리거를 발사할 때) 좋은 아이디어가 아닙니다.개발자들은 트리거가 있는지 살펴볼 생각조차 하지 않는 경우가 많습니다.

에, 이 을 마다 해야 를 를 에 이 을 FOO데이터베이스에서 생성되고, 그러면 그것을 배치하기에 가장 우둔한 장소가 될 수 있습니다.FOO 테이블 .

트리거를 사용하는 유일한 시간은 행의 수정된 날짜 필드를 설정하는 것과 같은 정말 간단한 작업입니다.

트리거가 필요한지 여부를 파악하는 데 어려움을 겪고 있으며 어떤 의견이라도 주시면 감사하겠습니다.필요한 경우 실행할 때 가장 중요하게 고려해야 할 사항은 무엇입니까?

트리거의 주요 문제는 다음과 같습니다.

  • 이들은 완전히 전역적입니다. 테이블 활동의 맥락에 상관없이 적용됩니다.
  • 그들은 은밀합니다. 의도하지 않은 (그리고 매우 불가사의한) 결과로 여러분을 다치게 할 때까지 그들이 그곳에 있다는 것을 잊기 쉽습니다.

이는 단지 적절한 상황에 맞게 신중하게 사용해야 한다는 것을 의미합니다. 제 경험으로는 관계 무결성 문제(때로는 선언적으로 얻을 수 있는 것보다 더 세분화된 경우도 있음)에 국한됩니다. 대개는 비즈니스 또는 거래 목적으로 사용하지 않습니다.YMMV.

아니요, 사실 좋은 생각이에요.특정 트리거에 문제가 있는 경우 제대로 수행하지 못하고 있지만 보통 트리거 자체의 개념이 아니라 구현에 문제가 있음을 의미합니다. :-).

DBMS 고유 활동을 데이터베이스가 속한 곳의 통제하에 두기 때문에 트리거를 많이 사용합니다.DBMS 사용자는 그런 것에 대해 걱정할 필요가 없습니다.데이터의 무결성은 데이터를 사용하는 애플리케이션이나 사용자가 아니라 데이터베이스 자체에 있습니다.데이터베이스의 제약 조건과 트리거 및 기타 기능이 없으면 규칙을 적용하는 것이 애플리케이션에 맡겨지고, 데이터를 파괴하는 데는 로그 또는 버그가 있는 애플리케이션/사용자 한 명만 필요합니다.

예를 들어, 트리거가 없으면 자동 생성 열과 같은 놀라운 것들이 존재하지 않을 것이고, 자동 생성 열을 선택할 때 각 행에서 함수를 처리해야 합니다.이는 DBMS 성능을 저하시킬 가능성이 있으며, 자동 생성된 열을 삽입/업데이트 시간에 생성하는 것이 훨씬 낫습니다. 변경되는 경우는 그 때뿐이기 때문입니다.

또한 트리거가 부족하면 사전 트리거와 같은 DBMS에서 데이터 규칙을 적용하여 열이 특정 형식을 갖도록 할 수 없습니다.이는 일반적으로 외부 키 조회에 불과한 데이터 무결성 규칙과는 다릅니다.

도구는 결코 악하지 않습니다.이러한 도구를 사용하는 것은 위험할 수 있습니다.

찬성합니다.트리거의 문제는 트리거가 아니라 사람입니다.더 살펴봐야 하고, 더 고려해야 하고, 올바르게 확인하는 코더의 부담이 커지지만, 우리는 우리의 삶을 더 단순하게 만들기 위해 인덱스를 폐기하지 않습니다. (나쁜 인덱스는 나쁜 트리거만큼이나 나쁠 수 있습니다.)

계기의 중요성은...
에 있어야 . -든은한다야상다야든y한d-sa은상en
이 집중화되어야 -이를기한는앙다야든지음에한(든다지음ep에야esdetde앙old-

유지보수의 관점에서 볼 때, 트리거는 경쟁사 코더들에게는 매우 유용하고 더 많은 주니어/아마추어 코더들에게는 문제가 됩니다.하지만 이 사람들은 어떻게든 배우고 성장해야 합니다.

당신의 근무 환경에 달려있는 것 같습니다.당신은 잘 배우고 체계적이라고 믿을만한 사람들이 있습니까?그렇지 않은 경우에는 두 가지 선택 사항이 있습니다.
하기 위해 해야 한다는 -을을야는에다해다에는t을해야t을uneoye'-
더더은육및가다는에나다에는t가른및t나tud-tder

그들은 가혹하게 들리는데, 제 생각에는 그런 것 같습니다.하지만 그건 기본적인 진리에요, 제 생각엔...

트리거는 악이 아니라 좋은 데이터베이스 설계에 필요하다고 생각합니다.응용프로그램 프로그래머들은 데이터베이스가 응용프로그램에 의해서만 영향을 받는다고 생각합니다.그들은 종종 틀립니다.데이터의 변화가 어디에서 오든 데이터 무결성을 유지하려면 트리거가 필요하며, 일부 프로그래머들은 너무 민족 중심적이어서 중요한 애플리케이션이 아닌 다른 것이 영향을 미칠 수 있다고 생각하지 않기 때문에 트리거를 피하는 것은 어리석은 일입니다.만약 당신이 유능한 데이터베이스 개발자라면 트리거를 설계하거나 테스트하거나 문제를 해결하는 것은 어렵지 않습니다.또한 트리거가 사용자가 예상치 못한 결과를 초래한다고 판단하는 것은 쉽지 않습니다.내 sp에서 참조하지 않는 테이블에 FK 오류가 있다고 말하는 오류가 발생하면 트리거가 문제를 일으키고 있으며 유능한 데이터베이스 개발자도 문제를 일으킬 것이라는 것을 아무 생각도 하지 않고 알고 있습니다.애플리케이션에만 비즈니스 규칙을 넣는 것은 다른 사람들은 규칙이 존재하는지도 모르고 자신의 프로세스에서 규칙을 위반하는 것을 알지 못하기 때문에 나쁜 데이터를 발견한 첫 번째 원인입니다.데이터 중심 규칙은 데이터베이스에 속하며 트리거는 보다 복잡한 규칙을 적용하는 데 핵심적인 역할을 합니다.

대부분 그렇습니다.

트리거의 어려움은 애플리케이션을 유지하는 개발자가 애플리케이션이 존재한다는 것을 쉽게 깨닫지 못하고 심지어 인지하지도 못한 채 상황을 망치는 변경을 수행한다는 것입니다.

이것은 단지 유지보수 작업을 추가하는 복잡한 층을 만듭니다.

일반적으로 저장된 절차/루틴은 트리거를 사용하기 보다는 동일한 작업을 수행하도록 만들 수 있지만, 명확하고 유지보수 가능한 방식으로 저장된 루틴을 호출하면 개발자가 소스 코드를 보고 정확히 무슨 일이 일어나고 있는지 확인할 수 있습니다.

트리거에는 로그/감사와 "마지막으로 수정된" 날짜를 유지하는 것이 이전 응답에서 언급된 두 가지 매우 좋은 용도입니다.

그러나 좋은 디자인의 핵심 원칙 중 하나는 비즈니스 규칙/비즈니스 논리/무엇이라고 부르든 한 곳에 집중해야 한다는 것입니다.트리거 또는 저장된 proc를 통해 일부 논리를 데이터베이스에 넣고 일부 논리를 응용 프로그램에 넣는 것은 이 원칙에 위배됩니다.논리를 두 곳 모두에서 복제하는 것은 더 나쁜 일입니다. 왜냐하면 논리는 항상 서로 맞지 않게 되기 때문입니다.

이미 언급된 '최소한의 놀라움의 원칙' 문제도 있습니다.

트리거는 매우 강력하고 유용하며, 트리거가 문제를 해결하는 최선의 방법인 시나리오도 많습니다.

그들은 또한 아주 훌륭한 "핵" 도구입니다.코드와 데이터베이스 모두를 즉시 제어하지 못하는 경우가 종종 있습니다.코드의 다음 주요 릴리스까지 2개월을 기다려야 하지만 데이터베이스에 패치를 즉시 적용할 수 있는 경우 테이블에 트리거를 적용하여 추가 기능을 수행할 수 있습니다.그런 다음 코드 릴리스가 가능하면 원하는 경우 이 트리거를 동일한 기능의 코드화된 버전으로 교체할 수 있습니다.

결국에는 모든 것이 무엇을 하는지 모른다면 "악"이 됩니다.방아쇠를 당기는 것은 그것을 이해하지 못하는 개발자들이 있기 때문이라고 판단하는 것은 어떤 사람들은 운전을 할 수 없기 때문에 자동차가 사악하다고 주장하는 것과 마찬가지입니다.

상위 레벨에서는 트리거에 대한 두 가지 사용 사례가 있습니다1

1) 일을 "자동적으로" 일어나게 만드는 것입니다.이 경우 트리거는 부작용을 일으키며, 실행된 (원시) 연산자 삽입, 업데이트 또는 삭제로 인해 트리거가 발화될 경우 예상하지 못했던 방식으로 데이터를 변경합니다.

여기서 일반적인 의견 일치는 유발 요인이 실제로 해롭다는 것입니다.INSERT, UPDATE 또는 DELETE 문의 잘 알려진 의미를 변경하기 때문입니다.이러한 세 가지 기본 SQL 연산자의 의미론을 변경하면 나중에 SQL 기본값을 사용하여 데이터베이스 테이블에서 더 이상 작동하지 않는 작업을 수행해야 하는 다른 개발자를 물 수 있습니다.

2) 선언적으로 처리할 수 있는 규칙 이외의 데이터 무결성 규칙을 적용합니다(CHECK, Primary KEY, UNIQUE KEY 및 FORINE KEY 사용).이 사용 사례에서 트리거가 수행하는 모든 작업은 INSERT/UPDATE/DEELETE에 의해 수행되는 변경이 허용되는지 여부를 확인하기 위한 쿼리(SELECT) 데이터입니다.선언적 제약이 우리에게 하는 것처럼.오직 이 경우에만 우리(개발자)가 시행 프로그램을 짰습니다.

후자의 경우 트리거를 사용해도 해롭지 않습니다.

http://harmfultriggers.blogspot.com 에서 블로그를 하고 있습니다.

트리거는 적절하게 사용할 때 좋은 도구입니다.변경사항 감사, 요약 표 채우기 등에 특히 해당합니다.

이제 다른 트리거를 시작하는 트리거 하나로 "트리거 지옥"에 빠지게 되면 그들은 "악"이 될 수 있습니다.저는 COTS 제품을 작업한 적이 있는데, 이 제품은 "플렉스 트리거(flex trigger)"라고 합니다.이러한 트리거는 실행될 때마다 동적 sql sting이 컴파일됨에 따라 테이블에 저장되었습니다.컴파일된 트리거는 해당 테이블에 실행할 플렉스 트리거가 있는지 조회한 다음 "플렉스" 트리거를 컴파일하고 실행합니다.이론적으로는 제품을 쉽게 커스터마이징할 수 있기 때문에 정말 멋진 아이디어로 들렸지만 실제로는 데이터베이스가 모든 컴파일 작업으로 인해 폭발적으로 증가했습니다.

그러니까요, 지금 하고 있는 일을 원근감 있게 지켜나가면 아주 좋아요.감사, 요약, 자동 시퀀싱 등과 같이 매우 간단한 것이라면 문제가 없습니다.테이블의 성장 속도와 트리거가 성능에 어떤 영향을 미칠지를 염두에 두십시오.

악하지 않습니다.그들은 실제로 다음과 같은 것들을 단순화합니다.

1. 레코드 또는 데이터베이스 스키마에 대한 변경사항 기록/감사

운영 환경의 변경 사항을 롤백하는 ALTER TABLE 트리거가 있을 수 있습니다.이를 통해 실수로 테이블을 수정하는 것을 방지할 수 있습니다.


2. 여러 데이터베이스에 걸쳐 참조 불성실(기본/대외 키 관계 등)을 강제합니다.

트리거는 항상 자신이 원하는 기능을 달성하기 위한 가장 직접적인 방법인 곳에 사용되어야 한다고 생각하는 개발자와 결코 사용하지 않을 개발자를 알고 있습니다.거의 두 진영 간의 독단에 가깝습니다.

하지만 저는 개인적으로 MarkR에 전적으로 동의합니다 - 여러분은 항상 기능적으로 동일한 코드를 작성할 수 있고 더 눈에 띄기 때문에 더 쉽게 유지할 수 있습니다.

그들이 악하다고 말하는 것은 과장이지만 망사를 일으킬 수 있습니다.한 트리거의 발화가 다른 트리거의 발화로 이어지면 정말 복잡해집니다.그들이 골치 아프다고 치자: http://www.oracle.com/technology/oramag/oracle/08-sep/o58asktom.html

트리거를 사용하여 Oracle에서 비즈니스 로직을 수행하는 것은 다중 동시성 문제 때문에 보이는 것보다 어렵습니다.다른 세션이 커밋하기 전까지는 다른 세션에서 변경사항이 표시되지 않습니다.

그들은 절대 악하지 않습니다.데이터베이스 스키마를 리팩토링하는 동안 열 이름을 바꾸거나 열을 두 개의 열로 분할하거나(예: 이름/성 대소문자) 전환을 지원하는 동안 트리거가 소중하다는 것을 알게 되었습니다.

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

이 답변은 SQL Server에만 적용됩니다.(다른 RDBMS에도 적용될 수 있지만 저는 잘 모릅니다.저는 여기서 을 주고 싶었지만 그것은 이것의 속임수로 종결되었습니다.)

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

"Managing Trigger Security(트리거 보안 관리)" 제목의 BOL에 있는 예는 코드를 포함하는 트리거를 생성하는 사용자에 대한 것입니다.GRANT CONTROL SERVER TO JohnDoe ;자신들의 허가를 높이기 위해서요

부작용이 있다면 설계상 문제입니다.일부 데이터베이스 시스템에서는 기본 키 ID 필드와 같은 자동 증분 필드를 설정할 수 있는 다른 가능성이 없습니다.

나는 그들이 사악할 수 있지만, 발전 중인 다른 것들만큼 사악할 수 있다고 생각합니다.

비록 제가 그들에 대한 경험이 많지는 않지만, 최근에 작업한 프로젝트에서 그들에 대한 경험이 있었고, 이것이 제가 이런 결론에 이르게 했습니다.제가 그들에게 가지고 있는 문제는 그들이 비즈니스 로직을 코드 라이브러리와 데이터베이스라는 두 곳으로 몰고 갈 수 있다는 것입니다.

나는 그것이 스프록스를 사용하는 것과 비슷한 논쟁이라고 봅니다.SQL이 비즈니스 로직을 데이터베이스에 기록하는 데 정말 능숙한 개발자가 있는 경우가 많지만, 그렇지 않은 개발자는 다른 곳에서 비즈니스 로직을 사용할 수 있습니다.

그래서 저의 경험칙은 당신의 프로젝트의 구조가 무엇인지를 살펴보는 것입니다.비즈니스 로직을 데이터베이스에 저장하는 것이 가능할 것 같으면 트리거를 사용하는 것이 유용할 수 있습니다.

아니요, 그들은 악이 아닙니다. 그저 오해를 받고 있을 뿐입니다 :-D

트리거에는 유효한 용도가 있지만, 결과적으로 상황을 악화시키는 레트로 해킹으로 너무 자주 사용됩니다.

응용프로그램의 일부로 DB를 개발하는 경우 논리는 항상 코드나 호출 과정에 있어야 합니다.트리거는 나중에 디버그-페인으로 이어집니다.

DB가 디스크의 파일에 액세스하는 방법, 잠금, 교착 및 방법을 이해한다면 올바른 방법으로 트리거(예: DB 직접 액세스 감사 또는 보관)를 사용하는 것이 매우 중요합니다.

실제로 트리거가 잘못 사용되는 경우가 꽤 많습니다.사실 대부분의 경우에는 그것들이 필요하지도 않습니다.하지만 그렇다고 해서 그들이 반드시 나쁘다고는 할 수 없습니다.

트리거가 유용한 시나리오는 소스 코드가 없는 레거시 애플리케이션이 있고 이를 변경할 방법이 없는 경우입니다.

트리거에 대한 아이디어는 사악하지 않고 트리거에 대한 둥지 설정을 제한하는 것은 사악합니다.

언급URL : https://stackoverflow.com/questions/460316/are-database-triggers-necessary