명시 적 기본 키가없는 DB에서 모든 테이블을 찾으려면 어떻게합니까?


10

Google 검색에서 클러스터 된 인덱스가없는 테이블을 찾는 방법에 대한 수백만 건의 조회수가 발생했으며 PK는 일반적으로 테이블의 클러스터 된 인덱스입니다. 그러나 테이블에는 클러스터 된 인덱스로서의 자연 키와 ID 열과 같은 비 클러스터형 대리 인덱스를 쉽게 가질 수 있습니다.

기본 키가 정의되지 않은 DB에서 모든 테이블을 찾으려면 어떻게합니까? 이 DB에는 245 개의 테이블이 있습니다. 수동 검사는 매우 비효율적입니다.

답변:


13

이 고양이를 벗기는 몇 가지 방법이 있지만 SQL Server 2005 이상에서는 잘 작동하며 문제를 처리하는 데 어려움이없는 방법입니다.

OBJECTPROPERTY()함수는 테이블과 같은 객체에 대한 다양한 속성을 나열 할 수 있습니다. 이러한 속성 중 하나는 테이블에 기본 키가 있는지 여부입니다.

OBJECTPROPERTY(object_id, tablehasprimarykey) = 0은 기본 키가없는 테이블입니다.

그래서

SELECT OBJECT_SCHEMA_NAME( object_id ) as SchemaName, name AS TableName
FROM sys.tables
WHERE OBJECTPROPERTY(object_id,'tablehasprimaryKey') = 0 
ORDER BY SchemaName, TableName ;

필요한 것을 주어야합니다. 온라인 서적에서 OBJECTPROPERTY () 함수를 사용하는 다른 방법에 대한 모든 내용을 볼 수 있습니다. 이 기사2012 버전입니다.


물론 object_id가 작동한다고 생각합니다. 함수를 사용하고 있다고 생각했지만 sys.tables자체가 id를 제공 하고이 멋진 기능을 보여 주셔서 감사합니다.
Biju jose

문제 없어요. 가지고있는 좋은 기능입니다. 많은 속성. 이 경우 그렇습니다 .sys.tables는 이미 그 안에 object_id를 나열합니다. 이것이 ID 매개 변수에 대해 OBJECTPROPERTY 함수에 전달하려는 object_id입니다. 예약 키워드를 잘 활용 해 주셔서 감사합니다. :)
Mike Walsh 5

, 당신은 object_id 함수에 대해 정확히 맞았습니다. 나는 단지 거기에 물건을 섞었습니다. 지적 해 주셔서 감사합니다. 잘 objectproperty()2005 년부터 사용할 수 있습니다.
Biju jose

예. 2005-2014 년과 그 이후에이 시점에서 :-)
Mike Walsh

스키마 이름을 추가하기 위해 스크립트를 편집했습니다. (OBJECTPROPERTY 같은) OBJECT_SCHEMA_NAME () 함수는 MSSQL 2005 년에 새로웠다 것으로 도시
그린 스톤 워커

5

Mike의 솔루션은 특정 문제에 탁월합니다.

당신이 더 많은 유연성을 원하는 경우, 여기 쉽게 쿼리로 변신 할 수있는 대안의 반환하는 등 힙 모든 테이블을 찾아, 또는 어떤 고유 제한 조건이없는 테이블을 찾는 등의 기타 정보 에 모두를 .

SELECT
    OBJECT_SCHEMA_NAME(t.object_id) AS SchemaName,
    t.name AS TableName
    FROM sys.tables t
    WHERE
        NOT EXISTS
        (
            SELECT *
                FROM sys.indexes i
                WHERE
                    (i.object_id = t.object_id) AND
                    (i.is_primary_key = 1)
        );

(서브) 시스템이 ~ 50 개의 테이블을 넘으면, 모든 메타 데이터 테이블에 익숙해지는 것이 중요합니다. 말했듯이, 각 테이블을 수동으로 진행하는 것은 비현실적이며 오류가 발생하기 쉽습니다!


"당신이 말했듯이, 각 테이블을 수동으로 진행하는 것은 비현실적이며 (오류가 발생하기 쉽습니다!)"+1 아멘. 매우 오류가 발생하기 쉬운 :)
Mike Walsh

4

SQL Server 의 정책 관리 기능은이 중 일부를 수행 할 수 있습니다.

테이블 패싯에는 @HasIndex 및 @HasClusteredIndex 필드 (트리거와 같이 유용 할 수있는 다른 필드)가 있습니다. 중앙 관리 서버 기능을 사용하여 여러 서버의 모든 테이블, 모든 데이터베이스의 조건을 확인하는 정책을 만들 수 있습니다.

그러나 기본 키 인덱스 나 제약 조건이 있는지 확인할 수는 없습니다. @HasPrimaryKey 필드가 있지만 MSSQL2012에는 없다고 맹세했을 것입니다. 나는 잘못 기억하거나 화를 내고 있습니다.

참고 : 정책 관리는 SQL Server 2012 Enterprise, Business Intelligence 및 Standard 버전에 포함되어 있습니다. Express Edition에서는 사용할 수 없습니다.


2
이것을 확인하는 사용자 정의 조건을 작성할 수 있다고 생각합니다. 완전히 다른 방법으로 +1하십시오.
Jon Seigel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.