Изменение коллекции схем SQL Server
-
20-09-2019 - |
Вопрос
Коллекция XML-схем SQL Server — интересная концепция, и я считаю ее очень полезной при проектировании содержимого динамических данных.Однако, когда я работаю над реализацией коллекций схем, мне очень сложно их поддерживать.
DDL коллекции схем позволяет только СОЗДАТЬ и ИЗМЕНЯТЬ/ДОБАВЛЯТЬ узлы в существующие схемы.
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.Чтобы сгенерировать операторы «Добавить схему», я предлагаю вам использовать функцию «Создать сценарии...» в меню задач в 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
Надеюсь, поможет.