2012-06-11 3 views
3

많은 행이있는 테이블이 있습니다.
테스트 용으로 제 동료도 같은 테이블을 사용하고 있습니다. 문제는 내가 테스트하고있는 행을 삭제하고 언젠가는 삭제하는 것입니다.
오라클에는 어떤 방법이 있어도 읽을 수있는 특정 행을 만들 수 있으므로 다른 행을 삭제하거나 편집하면 안됩니다.테이블의 행을 oracle에서만 읽게 만드시겠습니까?

감사합니다.

+3

각 테스터마다 서로 다른 스키마가 더 좋은 해결책이 될 것입니다. – kevinsky

답변

3

특정 행을 삭제하지 못하게하는 트리거를 만들 수 있습니다. 당신이 더 똑똑 할 수 물론

CREATE OR REPLACE TRIGGER trg_dont_delete 
    BEFORE DELETE 
    ON <your_table_name> 
    FOR EACH ROW 
BEGIN 
    IF :OLD.ID in (<IDs of rows you dont want to be deleted>) THEN 
     raise_application_error (-20001, 'Do not delete my records!!!'); 
    END IF; 
END; 

- if 성명을 발표는 user에 의존하거나 얻을 기록 ID를 다른 테이블에서 등

+1

+1 좋은 답변입니다. – Addicted

-1

에 오라클은 행 수준 잠금을 지원합니다. 다른 사용자가 사용중인 행을 h 제하지 못하게 할 수 있습니다. 더 나은 수표를 알고 있기 때문에 this link.

+2

이것은 트랜잭션에서 레코드를 사용하는 동안 레코드를 변경하는 다른 레코드를 사용하는 것을 방지합니다. 나는 OP가 그것을 사용하지 않을 때 다른 사용자가 테이블에서 레코드를 제거하고 있다고 불평하고 있다고 생각합니다. – APC

4

이 문제를 해결할 수있는 여러 가지 방법이 있습니다.

Sun Tzu said으로, 당신과 동료가 충돌하지 않는 데이터 세트를 사용하는 것이 가장 좋습니다.

예를 들어 로컬 PC에 각각 데이터베이스 인스턴스가있을 수 있습니다. 이것이 적합한 지 여부는 여러 가지 요소에 달려 있으며, 오라클과의 라이센스 계약은 그 중 가장 적은 것입니다. 또는 공유 데이터베이스에서 별도의 스키마를 가질 수 있습니다. 응용 프로그램에 따라 동의어 또는 특수 연결이 필요할 수 있습니다.

또 다른 접근법 : 모두가 테스트 픽스쳐로 알려진 자체 데이터 세트를 만듭니다. 테스트는 알려진 상태에 대해 실행될 때만 유효하기 때문에 이는 좋은 정책입니다. 데이터의 유무에 대한 가정을하면 테스트 결과가 얼마나 유효합니까? 요점은, 테스트가 자체적으로 정리해야하며, 조명기에서 생성 된 데이터를 제거하고 테스트를 실행해야한다는 것입니다. 이 전략을 사용하면 각 팀 구성원의 ID 범위를 동의해야합니다. 테스트 또는 개발 작업을 위해 범위 내에서 레코드를 사용해야합니다.

필자는 응용 프로그램의 작동 방식을 변경하지 않기 때문에 (다른 스키마와 동의어 사용을 제외하고는) 이러한 접근 방식을 선호합니다. 더 엄격한 방법을 사용할 수 있습니다.

Enterprise Edition을 사용하는 경우 행 수준 보안을 사용하여 레코드를 보호 할 수 있습니다. 이것은 마지막 지점의 연장입니다. 레코드를 식별하는 메커니즘과 세션 내에서 소유권을 식별하는 일부 인프라가 필요합니다. 그러나 다른 사용자가 데이터를 삭제하는 것을 방지하는 것 외에도 ID 범위가있는 레코드를 삽입, 업데이트 또는 보지 못하게 할 수도 있습니다. Find out more.

가벼운 용액은 use a trigger as A B Cade suggests입니다. 귀하의 기록과 연결된 사람을 식별해야합니다 (때때로 이므로은 여전히 ​​기록을 삭제하려고합니다.)

마지막 전략 : 집에 가져 가세요. 상태를 유지하고 데이터 펌프를 내보낼 수 있습니다.이 시점에서 테이블을자를 수 있습니다. 그러면 테이블을 사용할 때마다 데이터 펌프 가져 오기를 실행할 수 있습니다. 그러면 테이블의 상태가 재설정되고 기존의 데이터가 삭제됩니다 이것은 자신의 데이터를 생성하는 테스트 스크립트의 극단적 인 버전입니다.

관련 문제