SQL Server 스키마 컬렉션 수정
-
20-09-2019 - |
문제
SQL Server XML 스키마 컬렉션은 흥미로운 개념이며 동적 데이터 콘텐츠를 디자인할 때 매우 유용하다고 생각합니다.그러나 스키마 컬렉션을 구현하면서 이를 유지 관리하는 것이 매우 어렵다는 것을 알게 되었습니다.
스키마 컬렉션 DDL은 기존 구성표에 대한 CREATE 및 ALTER/ADD 노드만 허용합니다.
CREATE XML SCHEMA COLLECTION [ <relational_schema>. ]sql_identifier AS 'XSD Content'
ALTER XML SCHEMA COLLECTION [ <relational_schema>. ]sql_identifier ADD 'Schema Component'
스키마에서 노드를 제거하려면 다음 DDL을 실행해야 합니다.
- 해당 스키마 컬렉션이 테이블 열에 할당된 경우 테이블을 변경하여 해당 열에서 스키마 컬렉션 연결을 제거해야 합니다.
- 스키마 컬렉션 개체 삭제
- 스키마 컬렉션 다시 만들기
- 테이블 열을 변경하여 스키마 컬렉션을 해당 열에 다시 연결합니다.
컬렉션에 포함된 구성표가 100개 이상인 경우 이는 고통스러운 일입니다.또한 XML 인덱스가 있는 경우 처음부터 다시 생성해야 합니다.
이 스키마 컬렉션 개체 편집 프로세스를 더 쉽게 만드는 솔루션, 제안, 요령이 있습니까?
해결책
나는 XML이 우리가 말한 만병통치약은 아니지만, XML이 불가피하거나 작업에 가장 적합한 도구인 상황이 있다는 David의 의견에 동의합니다.하지만 스키마 유지 관리는 고통스럽습니다.처리해야 할 일이 몇 개 밖에 없는데 여전히 시간을 낭비합니다.
이 스크립트가 도움이 될 수 있습니다.테이블 드롭을 생성하고 필요한 추가 기능을 제공합니다.XML 스키마를 참조할 수 있는 UDF 또는 기타 개체를 포함하도록 수정해야 합니다.스키마 추가 문을 생성하려면 Mgt Studio의 작업 메뉴에서 "스크립트 생성..." 기능을 사용하고 스크립트의 2단계를 위해 저장해 두는 것이 좋습니다.
SET NOCOUNT ON
/*
1) Save cols to table var
*/
DECLARE @xmlCols TABLE (
numID INTEGER IDENTITY(1,1),
TBL nvarchar(1024),
COL nvarchar(1024),
SCH nvarchar(1024)
);
insert into @xmlCols (TBL,COL,SCH)
SELECT DISTINCT OBJECT_NAME(colm.object_id) AS 'TABLE', colm.name AS 'COLUMN', coll.name AS 'Schema'
FROM sys.columns colm
inner JOIN sys.xml_schema_collections coll
ON colm.xml_collection_id = coll.xml_collection_id
ORDER BY OBJECT_NAME(colm.object_id), colm.name
DECLARE @lastRow as int
DECLARE @currentRow as int
DECLARE @dbName as varchar(1024)
DECLARE @tableName as varchar(1024)
DECLARE @colName as varchar(1024)
DECLARE @schemaName as varchar(1024)
SET @lastRow = @@ROWCOUNT
SET @currentRow = @lastRow
SET @dbName = 'dbNAme'
print ''
print '--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
print '--!!!!! Scipt Schemas and Save in Mgt Studio !!!!'
print '--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
print ''
print ''
print '--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
print '--!!!!! Omit Schemas from COls !!!!'
print '--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
print ''
--omit the Schema for each column
WHILE @currentRow <> 0
BEGIN
SELECT @tableName=TBL, @colName=COL, @schemaName=SCH from @xmlCols WHERE numID = @currentRow
print N'ALTER TABLE [' + @tableName + N'] ALTER COLUMN ['+ @colName + N'] XML'
set @currentRow = @currentRow -1
END
print ''
print '--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
print '--!!!!! drop your xml schema(s) !!!!'
print '--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
print ''
SET @currentRow = @lastRow
WHILE @currentRow <> 0
BEGIN
SELECT @tableName=TBL, @colName=COL, @schemaName=SCH from @xmlCols WHERE numID = @currentRow
print N'DROP XML SCHEMA COLLECTION [dbo].['+@schemaName+']'
set @currentRow = @currentRow -1
END
print ''
print '--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
print '--!!!!! CLean your Tables !!!!'
print '--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
print ''
--clean up the tables
SET @currentRow = @lastRow
WHILE @currentRow <> 0
BEGIN
SELECT @tableName=TBL, @colName=COL, @schemaName=SCH from @xmlCols WHERE numID = @currentRow
print N'DBCC CleanTable (''' + @dbName + N''', ''' + @tableName + N''', 0)'
set @currentRow = @currentRow -1
END
print ''
print '--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
print '--!!!!! Run XML Schema Scripts !!!!'
print '--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
print ''
SET @currentRow = @lastRow
WHILE @currentRow <> 0
BEGIN
SELECT @tableName=TBL, @colName=COL, @schemaName=SCH from @xmlCols WHERE numID = @currentRow
print N'ALTER TABLE [' + @tableName + N'] ALTER COLUMN ['+ @colName + N'] XML('+ @schemaName + N')'''
set @currentRow = @currentRow -1
END
도움이 되길 바랍니다.
제휴하지 않습니다 StackOverflow