"처벌"개발자 또는 자동으로 수정 하시겠습니까? 트리거 대 제약 조건
-
03-07-2019 - |
문제
항상 대문자에 있어야하는 데이터베이스 열이 있다고 가정 해 봅시다.
다음은 몇 가지 아이디어입니다.
1) 열 제약 조건을 만듭니다. col = UPPER(col)
2) 전 삽입/업데이트 행 트리거를 설정합니다. col = UPPER(col)
일반적으로 데이터베이스 데이터에 대한 제약이 많을수록 더 좋으며 트리거는 신비 롭고 나쁠 수 있습니다. 개발자가 코드를 쓰는 사람이 동일한 조직에 있으므로 작성된 코드는 당사가 수정할 수 있다고 가정합니다.
어떤 접근법을 사용하고 그 이유는 무엇입니까?
문제의 데이터가 실제로는 항상 대문자이기 때문에 대문자 여야합니다 (원래 여러 타사에 의해 인쇄되어 있습니다). 이 특정 필드의 대문자와 소문자에는 의미가 없습니다.
해결책
칼럼이 왜 대문자에 있어야하는지에 따라 다르지만 일반적으로 제약 조건으로 갈 것입니다.
데이터베이스에 데이터를 삽입 할 때 데이터를 변경하는 것은 마음에 들지 않습니다. 그것은 내가 쓴 내용과 다음에 읽을 내용 사이에 불일치가 있다는 것을 의미합니다.
사용자가 텍스트를 입력 한 경우 어퍼 케이스 버전이 포함 된 추가 열을 추가하십시오. 이렇게하면 항상 사용자가 입력 한 텍스트를 표시합니다.
다른 팁
대부분의 상황에서 나는 (1) 말할 것입니다. 그러나 문자열 케이스 감도를 다룰 때, 나는 그것을 특별한 경우로 취급하고 항상 길을 따라 모든 단계에서 그것을 고치는 경향이 있습니다. 나는 그렇게 할 구체적인 이유가 있는지 잘 모르겠다. 단지 "느낌". 아마도 대부분의 환경에서 나는 적어도 비즈니스 논리 관점에서 일했기 때문일 것입니다. FoO
항상 동일합니다 foo
항상 동일합니다 FOO
.
또한이 경우 개발자가 "FYI, 모든 문자열은 서버의 대문자에 저장됩니다"라고 말하는 것은 잊어 버릴 때마다 손목을 때리는 것보다 부담이 적습니다. "FYI, DB에 가격을 삽입 할 때마다 판매 세가 추가됩니다."
이것은 제약 조건으로 가장 잘 구현되며 추가로드를 피하고 원하는 것을 수행합니다. 데이터를 필요한 형식으로 강제합니다.
무결성 손실없이 변환 될 수있는 데이터는 데이터베이스 계층에서 처리해야하기 때문에 데이터베이스에서 전환을 강제로 전환하는 것이 잘못된 접근법이라고 생각합니다. 케이스가 무의미한 경우 그렇게 처리하면 제약이 오류를 잡는 데 도움이됩니다.
케이스 insensitive index 추가 더 나은 솔루션 일 수 있습니다 (참조. 데이터베이스 케이스 insensitive index)
또는 자동 테스트의 적용 범위를 늘리고 생산 서버의 추가 부하를 피하십시오.
개발자가 저장된 프로 시저 (또는 무엇이든)로 값을 전달할 수있는 "테이블 API"를 제공하는 또 다른 접근법도 고려하여 값이 삽입의 대문자임을 보장합니다. 나는 이것을 제약으로 뒷받침하고 (한 가지에 대한 쿼리 최적화에 도움이 될 수 있음) 테이블에서 직접 변경 권한을 제거 할 것입니다. 개발자가 대문자를 신뢰하지 않으면 모든 삽입물을 신뢰하지 않으면 신뢰해서는 안됩니다. 항상 tapi를 사용하십시오.
데이터베이스 악의에서 열 제약 조건에서 무언가를 할 수 있다면 트리거가 일반적으로 더 빠르기 때문에 선호됩니다. 응용 프로그램을 통해 시행에 대해 이야기하고 있다면 권장하지 않습니다. 규칙이 항상 적용되어야하는 경우 데이터베이스를 제외한 어느 곳에도있어서는 안됩니다. 코드를 작성하는 응용 프로그램 이외의 사항은 데이터베이스의 데이터를 변경할 수 있습니다. 데이터 무결성은 TEH 데이터베이스의 책임이며, 문제를 피하기위한 코드를 유지하십시오.