600 개가 넘는 테이블이있는 데이터베이스가 있습니다. 일부 테이블에는 기본 키가 있고 일부는 그렇지 않습니다. 동적으로 수행하는 방법 :
1. 모든 테이블을 반복합니다
. 2. 기본 키가없는 테이블을 선택합니다.
3. 자동 증분 필드를 추가합니다
. 4.이 필드를 기본 키로 만듭니다.
나는 그것이 다음의 조합이라고 생각합니다.
USE MyDataBase;
GO
-- List all tables without primary constraint
SELECT i.name AS IndexName,
OBJECT_NAME(ic.OBJECT_ID) AS TableName,
COL_NAME(ic.OBJECT_ID,ic.column_id) AS ColumnName
FROM sys.indexes AS i
INNER JOIN sys.index_columns AS ic
ON i.OBJECT_ID = ic.OBJECT_ID
AND i.index_id = ic.index_id
WHERE i.is_primary_key = 0
GO
-- add new auto incremented field
ALTER TABLE MyTable
ADD PK_ID BIGINT IDENTITY;
GO
-- create new primary key constraint
ALTER TABLE MyTable
ADD CONSTRAINT PK_ID PRIMARY KEY NONCLUSTERED (PK_ID);
GO
이 쿼리는 기본 키 또는 ID 열이있는 모든 테이블을 제외하고 나머지 개체에 ID 열과 기본 키를 추가합니다.
DECLARE @PKScript AS VARCHAR(max) = '';
SELECT @PKScript +=
' ALTER TABLE ' + QUOTENAME(SCHEMA_NAME(obj.SCHEMA_ID))+'.'+ QUOTENAME(obj.name) +
' ADD PK_ID BIGINT IDENTITY;' +
' ALTER TABLE ' + QUOTENAME(SCHEMA_NAME(obj.SCHEMA_ID))+'.'+QUOTENAME(obj.name) +
' ADD CONSTRAINT PK_ID_' + obj.name+ ' PRIMARY KEY NONCLUSTERED (PK_ID) '
FROM sys.objects obj
WHERE object_id not in
(select parent_object_id
from sys.key_constraints
where type = 'PK'
UNION
Select object_id
from sys.identity_columns
)
AND type = 'U'
--PRINT (@PKScript);
EXEC(@PKScript);
이미 ID 열이 정의 된 테이블의 경우이 쿼리를 사용하여이 ID 열을 기본 키로 설정할 수 있습니다 (동일한 테이블에 두 개의 ID 열을 가질 수 없기 때문).
DECLARE @PKScript2 VARCHAR(max)='';
SELECT @PKScript2 += ' ALTER TABLE ' + QUOTENAME(SCHEMA_NAME(obj.SCHEMA_ID))+'.'+
QUOTENAME(obj.name) + ' ADD CONSTRAINT PK_' + icol.name +'_'+ obj.name+
' PRIMARY KEY NONCLUSTERED (' + QUOTENAME(icol.name) + ')' + CHAR(13)
FROM sys.identity_columns icol INNER JOIN
sys.objects obj on icol.object_id= obj.object_id
WHERE NOT EXISTS (SELECT * FROM sys.key_constraints k
WHERE k.parent_object_id = obj.object_id
AND k.type = 'PK')
AND obj.type = 'U'
--PRINT (@PKScript2);
EXEC(@PKScript2);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다