Изменение коллекции схем SQL Server

Коллекция XML-схем SQL Server — интересная концепция, и я считаю ее очень полезной при проектировании содержимого динамических данных. Однако по мере того, как я работаю над внедрением коллекций схем, мне очень сложно их поддерживать.

Коллекция схем 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.

  1. Если эта коллекция схем назначена столбцу таблицы, вам необходимо изменить таблицу, чтобы удалить ассоциацию коллекции схем из этого столбца.
  2. Отбросьте объект коллекции схем
  3. Повторное создание коллекции схем
  4. Изменить столбец таблицы, чтобы повторно связать коллекцию схем с этим столбцом.

Это боль, когда речь идет о 100+ схемах в коллекции. Также вам придется заново создавать XML-индексы, если таковые имеются.

Любые решения, предложения, приемы, чтобы упростить процесс редактирования объекта коллекции схем?


person mevdiven    schedule 11.02.2010    source источник
comment
Хороший вопрос. Я всегда хотел знать, как именно работает ALTER/ADD и как он манипулирует исходным XML.   -  person devio    schedule 11.02.2010
comment
именно такая плохая поддержка типов XML в SQL Server 2005 заставила нас отказаться от них. Они кажутся аккуратными, но дальше по дороге возникает целая куча проблем. Худшими для нас были: невозможность использовать таблицу со столбцами типа XML в распределенном запросе (связанный сервер); а вычисляемые столбцы сложно запрограммировать из-за порядка зависимостей. Просто скажите «нет» и делайте чисто реляционные отношения.   -  person David Roussel    schedule 10.03.2010


Ответы (1)


Я согласен с Дэвидом в том, что XML не является панацеей, как нам говорили, но есть ситуации, когда он либо неизбежен, либо является лучшим инструментом для работы. Однако обслуживание схемы болезненно. У меня всего пара дел, и я все еще теряю часы.

Этот скрипт может помочь. Он генерирует таблицы и добавляет, что вам нужно. Его необходимо модифицировать, чтобы включить UDF или другие объекты, которые могут ссылаться на 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

Надеюсь, поможет.

person Laramie    schedule 15.03.2010
comment
Большое спасибо. Я попробую ваше решение, как только смогу. - person mevdiven; 17.03.2010