중복성을 확인하기 위해 테이블을 삭제하지 않고 숨기거나 비활성화하는 방법은 무엇입니까?


12

더 이상 사용되지 않는 웹 서비스 메서드 및 데이터베이스 테이블이 포함 된 기존 시스템을 유지 관리하고 확장해야합니다. 테이블이 실제로 중복되는지 확실하지 않기 때문에 테이블을 삭제하는 것이 두렵습니다.

같은 효과 (테이블을 더 이상 사용할 수 없음)를 떨어 뜨리지 않고 달성 할 수있는 다른 방법이 있습니까? 내 생각은 그것들을 Deleted현재 기본값과 다른 스키마 (예 :)로 옮기는 것이 었습니다 dbo.

IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'Deleted')
BEGIN
   EXEC('CREATE SCHEMA Deleted')
END

ALTER SCHEMA Deleted TRANSFER dbo.TableName;

다른 방법이 있습니까, 아니면 스키마 접근 방식에 단점이 있습니까?

답변:


7

테이블을 떨어 뜨리지 않고 동일한 테이블을 더 이상 사용할 수있는 다른 방법이 있습니까?

스키마 변경은 매우 빠른 작업입니다. 메타 데이터 만 변경하면됩니다. 내가 얻은 원래 아이디어는 Aaron Bertrand의 블로그 인 Schema Switch-A-Roo에서 였습니다.

내 대답 의 단계를 여기 에서 수행 할 수 있습니다

sp_rename N'old table ', N'new table' 또는 테이블에 대한 권한 거부 와 같은 다른 방법이 있습니다 .


모든 것이 도움이되기 때문에 어떤 대답을 받아 들여야하는지 잘 모르겠습니다. 나는 Aaron의 기사를 몰랐기 때문에 더 많은 정보가 포함되어 있기 때문에 이것을 받아 들였습니다.
Tim Schmelter

@TimSchmelter 유용하다고 생각합니다. 기사 또는 내 답변 (연결)을 반복하는 것이 합리적이지 않습니다. 그것이 내가 그것을 참조한 이유입니다.
Kin Shah

12

다른 몇 가지 옵션은 테이블 이름을 바꾸거나 클러스터 된 인덱스가있는 경우 클러스터 된 인덱스를 비활성화 할 수 있습니다.


감사. 클러스터형 인덱스를 비활성화하면 테이블을 사용할 수 없게됩니다. 이러한 접근법 (+ 스키마)의 장단점은 무엇입니까?
Tim Schmelter

5
@TimSchmelter CI를 비활성화하는 단점은 CI를 다시 활성화하려면 인덱스를 다시 작성해야한다는 것입니다. 데이터베이스 소유자 나 sys 관리자는 여전히 소유권 체인을 통해 테이블을 볼 수 있지만 다른 옵션은 테이블에 대한 퍼블릭 역할에 대한 권한을 거부하는 것입니다.
Martin Smith

테이블을 삭제하거나 테이블에서 열을 삭제하기 전에 이름 끝에 "_deprecated"등을 추가하여 이름을 바꾸는 경우가 많습니다. 그런 다음 오류가 없으면 참조하는 것이 없어야합니다.
Jay

권한이 변경되었습니다. 응용 프로그램을 실행하는 서비스 계정이 dbo이거나 더 나쁜 sysadmin이면 모든 유형의 DENY를 완전히 무시합니다. 바라건대 그들은 그렇지 않지만 일어나지 않습니다.
케네스 피셔

6

사용 중인 역할 / 그룹 / 계정에서 테이블에 대한 권한 을 제거하십시오 .

무언가가 터지면 다시 빠릅니다.

힌트 : 스크립트를 사용하여 이러한 변경 작업을 수행하는 것은 정말 좋은 아이디어입니다.


비 프로덕션 데이터베이스에서 테스트하는 것과 같습니다. ;) 그러나 그것은 OP에 명백했다.
jpmc26

@ jpmc26. 비 프로덕션 데이터베이스에서 먼저 테스트합니다. 그러나 문제는 함수 또는 데이터베이스 객체가 외부에서 사용되는지 알고 싶습니다 (웹 서비스 방법뿐만 아니라 회사의 다른 위치에있는 데이터베이스 또는 관리 도구에서 직접 사용).
Tim Schmelter

흠. DBA에 의한 직접 DB 액세스를 찾고 있다면 로깅이 순서대로 들리는 것 같습니다. 수동 작업에서 prod 및 non-prod에서 동일한 사용법을 보지 못할 수도 있습니다. 이러한 작업을 기록하는 것이 얼마나 쉬운 지 잘 모르겠지만, 제품에 로그인 한 경우 사용법을 찾기 위해 분석 할 수 있습니다.
jpmc26

@ jpmc26 : 관리자가 얼굴을 쓰면 괜찮을 것입니다. 고객에게는 좋지 않지만 롤아웃 전에 테스트 시스템에서 확인할 수 있습니다.
Tim Schmelter

3

다른 사람이 권한을 가지고 있지 않다고 확신 할 수 없으므로 권한 제거는 일반적으로 작동하지 않습니다. 아마도 그룹, 역할 또는 sysadmin이기 때문에 (아마 희망하지는 않더라도).

테이블의 경우 비활성화 할 있습니다. 그리고 그것은 빠른 과정입니다. 그러나이를 사용 하려면 재 빌드해야하고 시간이 오래 걸릴 수있는 큰 테이블이 필요합니다.

가장 좋은 방법은 객체를 새로운 스키마로 옮기거나 (제안한대로) 객체의 이름을 바꾸는 것입니다. 이러한 작업은 모두 쉽고 빠르게 수행 할 수 있습니다. 권한도 양방향으로 유지됩니다.

추가 단계 는 개체 의 확장 속성 에 "TBD 메모"를 추가하는 것입니다. 변경 한시기 및 / 또는 제거하기에 안전한 이유에 대한 메모를 작성할 수 있습니다.

며칠 동안 확장 이벤트 세션 (또는 프로파일 러 추적)을 실행하여 사용중인 모든 객체가 있는지 확인하십시오. 오버 헤드를 줄이기 위해 세션을 오브젝트 이름과 터치했을 때 세션으로 크게 제한 할 수 있습니다. 또한이 세션을 며칠 동안 말과 분기 말에 며칠 동안 실행하여 모든 것을 갖추 었는지 확인하십시오.


3

Phil W.가 제안한대로 권한을 제거하십시오.

또한 테이블을 사용하는 모든 스토어드 프로 시저에서 권한을 제거하십시오. SQL Server에서 (다른 사람에 대해서는 모른다) 권한은 호출 객체 (예 : 저장 프로 시저)에서 호출 된 객체 (예 : 테이블)로 연결됩니다.


작업은 모든 도구, 함수, 개체, 쿼리 (원격 데이터베이스에서도)가 이러한 테이블에 액세스하지 못하도록하는 것이 었습니다. 저장 프로 시저를 수정 해야하는 경우 이미 사용하고 있다는 것을 알아야합니다. 또는 저장 프로 시저에서 테이블이 사용되는지 확인하는 간단한 방법이 있습니까?
Tim Schmelter

저장 프로 시저를 수정하지 말고 EXECUTE 권한 만 제거하는 것이 좋습니다. 당신이 말했듯이, 필요한 경우 권한을 쉽게 복원 할 수 있습니다. 저장 프로 시저에서 사용하는 테이블을 확인할 수 있습니다. SQL Server Management Studio의 개체 탐색기에서 데이터베이스-> 프로그래밍-> 저장 프로 시저를 선택하십시오. sproc 이름을 마우스 오른쪽 단추로 클릭하고 종속성보기를 선택하십시오. [sproc name]이 종속 된 개체를 선택하십시오.
피터 빌
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.