2011-11-04 4 views
3

레코드가 특정 테이블에 입력되면 삭제하지 않기를 바란다고 생각합니다. 레코드는 역사적 목적을 위해 사물을 추적 할 수 있습니다. 나는 MySQL을 사용하고있다. InnoDB. 해당 테이블을 응용 프로그램 계층에서 실수로 삭제하지 못하도록 보호 할 수있는 방법이 있습니까? 그렇다면 좋은 접근 방법입니까?MySQL : 삭제를 방지하는 방법?

답변

0

또 다른 옵션은 내역 표에 대한 ARCHIVE 엔진으로 전환하는 것입니다.

이렇게하면 테이블에 대한 DELETE 또는 UPDATE 작업을 방지하고 데이터를 압축합니다. 이 접근법의 한 가지 (주요) 단점은 테이블의 열을 인덱싱 할 수 없다는 것입니다.

+0

열을 인덱싱 할 수 없다면 나에게 어떤 의미가 있습니까? InnoDB와 Archive를 섞어도 되나요? – StackOverflowNewbie

+0

그건 그렇고, 참조 무결성을 강화할 수 있도록 InnoDB를 사용했습니다. 아카이브를 사용하면 어떻게됩니까? – StackOverflowNewbie

+0

아카이브에 "행 캐시"가 없습니다. 이게 무슨 뜻입니까? 또한, "삽입하는 동안 SELECT 문을 많이 사용하면 대량 또는 지연된 삽입 만 사용하지 않는 한 압축을 악화시킬 수 있습니다"라는 메시지가 표시됩니다. – StackOverflowNewbie

3

사용자에 대한 권한을 설정할 수있는 경우 삭제 권한을 부여하지 마십시오. 이 사례가 통계 목적의 표와 같이 반드시 있어야하는 상황이 있습니다. 따라서 테이블을 사용하여이 목표 중 하나를 달성하면 좋은 접근 방법입니다.

+0

특정 테이블에 대해이 작업을 수행 할 수 있습니까? 이 작업을 서버에서 구성해야합니까? 의미,이 응용 프로그램을 설치할 때마다 계속이 작업을 수행해야합니까? 잊어 버리면 어떡하지? – StackOverflowNewbie

+0

@StackOverflowNewbie 내가 아는 한, 당신은 할 수 없습니다. 일반적으로 서버에 구성해야합니다. 또한 매번이 작업을 수행해야하며 사용자가 잊어 버린 경우 사용자가 행을 삭제할 수 있습니다. –

0

응용 프로그램 계층에이 논리를 구현하고 삭제하지 않을 플래그를 삽입하는 열을 삽입해야한다고 생각합니다.

또 다른 아이디어는 DB 사용자의 삭제 액세스를 제외하는 것입니다

+0

응용 프로그램 계층에서 테이블을 보호하려고합니다. 나는이 표에서 삭제할 것이 아무것도 구현하지 않을 것이다. 그러나, 나는 (예를 들어, 다른 누군가가이 테이블에서 나중에 삭제할 논리를 구현하거나 누군가가 phpMyAdmin을 사용하고 해당 테이블에서 무언가를 삭제하려고 할 때) 테이블 자체를 방어 할 수 있는지 확인하고자합니다. – StackOverflowNewbie

0

그런 다음 레코드를 다시 삽입, 삭제를 감지하는 트리거를 작성 할 수 있습니다,하지만 몇 가지 문제가있을 수 있습니다, 당신은 할 수 있습니다 또한 삭제를 막을 외래 키 제약 조건을 추가하십시오.

이에 대한 일부 토론은 http://rpbouman.blogspot.com/2011/10/mysql-hacks-preventing-deletion-of.html에서 확인할 수 있습니다.

+0

레코드를 다시 삽입하면 원래의 자동 증가 PK를 잃게됩니다. FK 제약 솔루션은 어떻게 작동합니까? – StackOverflowNewbie

+0

내가 제공 한 링크를 읽었습니다. FK 구속력 해결 방안은 해커처럼 보입니다. 어떻게 생각해? – StackOverflowNewbie

+0

이러한 접근 방식 중 일부는 조금 hackish 있습니다.사람들이 삭제할 수 없도록하는 것이 올바른 생각이지만 고유성을 위반하지 않는 한 자동 증가 열에 삽입 할 수 있습니다. –

1

삭제 작업을 감지하고 불법적 인 작업을 수행하여 전체 작업이 실패하는 트리거를 사용합니다. 예를 들면 다음과 같습니다.

CREATE TRIGGER protect_delete before delete ON protected_table 
FOR EACH ROW UPDATE non_existing_table SET non_existing_column=1; 

누군가 삭제 작업을 시도하면 전체 문장이 실패합니다. 또한 non_existing_column 및 non_existing_table에 더 나은 이름을 사용할 수도 있습니다.

ERROR 1146 (42S02) : 표 'database.delete_restricted_on_tableX' 가

EDIT 존재하지 않는다 :

예는 이와 같은 오류 메시지를 얻을 수있다 또한입니다 더 나은 오류 메시지를 생성하려면 여기를 확인하십시오. http://www.brokenbuild.com/blog/2006/08/15/mysql-triggers-how-do-you-abort-an-insert-update-or-delete-with-a-trigger/

관련 문제