2015-01-23 4 views
0

SQL Server 데이터베이스에서 모든 사용자 개체를 삭제하지만 테이블과 해당 레코드는 그대로 유지하려고합니다. 그러나 나는 또한 제약 조건을 떨어 뜨리고 싶다.테이블을 모른 채 제약 조건을 삭제하는 방법은 무엇입니까?

SELECT 
    'DROP ' + 
    CASE 
     WHEN [sys].[all_objects].type IN ('AF','FN','FS','FT','IF','TF') THEN 'FUNCTION ' 
     WHEN [sys].[all_objects].type IN ('D','C','F','PK','UQ') THEN 'CONSTRAINT ' 
     WHEN [sys].[all_objects].type IN ('IT','S','U') THEN 'TABLE ' 
     WHEN [sys].[all_objects].type IN ('P','PC','RF','X') THEN 'PROCEDURE ' 
     WHEN [sys].[all_objects].type IN ('TA','TR') THEN 'TRIGGER ' 
     WHEN [sys].[all_objects].type = 'R' THEN 'RULE ' 
     WHEN [sys].[all_objects].type = 'SN' THEN 'SYNONYM ' 
     WHEN [sys].[all_objects].type = 'TT' THEN 'TYPE ' 
     WHEN [sys].[all_objects].type = 'V' THEN 'VIEW ' 
    END + 
    SCHEMA_NAME(sys.[all_objects].[schema_id]) + '.' + OBJECT_NAME(object_id) + '; ', OBJECT_NAME(object_id), [sys].[all_objects].[type_desc], [sys].[all_objects].[type], SCHEMA_NAME(sys.[all_objects].[schema_id]) 
FROM 
    sys.[all_objects] WITH (NOLOCK) -- WHERE (OBJECT_DEFINITION(object_id) LIKE '%' + @toDrop + '%') AND ([sys].[all_objects].[name] <> @toDrop); 
WHERE 
    (SCHEMA_NAME(sys.[all_objects].[schema_id]) <> 'sys') AND 
    (SCHEMA_NAME(sys.[all_objects].[schema_id]) <> 'INFORMATION_SCHEMA') AND 
    ([sys].[all_objects].[type_desc] <> 'USER_TABLE') 
ORDER BY 
    [sys].[all_objects].[type_desc], SCHEMA_NAME(sys.[all_objects].[schema_id]), OBJECT_NAME(object_id) 

문제는, 제약 경우에 나는 그래서 모든 제약 조건을 삭제하려면 어떻게합니까 ALTER TABLE x DROP CONSTRAINT y

를 사용해야합니다 : 그래서 내가 SMSS에 붙여 넣기 한 후 실행됩니다 드롭 선언을 얻기 위해이 쿼리를 생성 용이하게?

+0

. 'sys.objects.parent_object_id'에서'sys.tables'에 가입하여 부모 테이블 이름을 얻을 수 있습니다 (왜, 왜,'sys.all_objects'를 사용하고 있습니까?). –

+0

@AaronBertrand 왜냐하면 나는 테이블을 제외하고 모두 그것을 내리고 싶다. 데이터베이스 마이그레이션을 원하지만 발견 된 도구는 모두 잘못되었습니다. – PSyLoCKe

+0

'sys.all_objects'는 기본적으로 객체와 시스템 객체의 결합체입니다. 기본적으로 똑같은 일을하는'sys.all_objects'에 대한 필터가 있습니다. 그래서'sys.objects'를 사용하십시오. 또한 가독성을 위해 별칭을 사용하는 것에 대해 생각해보십시오. 테이블을 삭제하지 않으려면 CASE 표현식에 명시 적으로 'DROP TABLE'옵션이 있습니까? 그리고 내부 테이블이나 시스템 테이블을 삭제할 수 없다는 것을 알고 있습니다. 그렇다면 왜 그 테이블에있는 것입니까? –

답변

0
SELECT 
     'ALTER TABLE ' + 
     SCHEMA_NAME(sys.[objects].[schema_id]) + '.' + OBJECT_NAME([sys].[objects].[parent_object_id]) + 
     ' DROP CONSTRAINT ' + 
     OBJECT_NAME(object_id) + '; ', OBJECT_NAME(object_id), [sys].[objects].[type_desc], [sys].[objects].[type], SCHEMA_NAME(sys.[objects].[schema_id]), 
     OBJECT_NAME([sys].[objects].[parent_object_id]) 
    FROM 
     sys.[objects] WITH (NOLOCK) 
    WHERE 
     (SCHEMA_NAME(sys.[objects].[schema_id]) <> 'sys') AND 
     ([sys].[objects].[type_desc] <> 'USER_TABLE') AND 
     ([sys].[objects].TYPE IN ('D','C','F','PK','UQ')) AND 
    ORDER BY 
     [sys].[objects].[type_desc], SCHEMA_NAME(sys.[objects].[schema_id]), OBJECT_NAME(object_id) 
GO 
스키마 접두사 중 하나 (물론, 그것이 다른 위치에있을 것입니다) 그 문에 사용되지 않기 때문에, 조건부 논리를 가지고해야합니다
+0

당신은'OBJECT_NAME' /'SCHEMA_NAME' 함수에 대해 좋아하는 것 같습니다. 조인은 IMHO가 좋습니다. 다음을 읽어보십시오. http://blogs.sqlsentry.com/aaronbertrand/bad-habits-metadata-helper-functions/ –