|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
Glory, Спасибо, понятно. А было бы удобно, если бы такая возможность была. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2013, 16:41 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
trewА было бы удобно, если бы такая возможность была. Ага. Мы сделали сначала поле varchar(max) для хранения даты-времени Потом решили поменять его на datetime Хорошо бы было, если бы сервер сам сконвертировал все данные из одного типа в другой. Тут и сказке конец. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2013, 16:44 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
Гость333, Не пробовал, страшно :-) напрямую вообще сторонними дизайнерами не трогаю. Но уверен, что не сможет ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2013, 17:05 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
GlorytrewА было бы удобно, если бы такая возможность была. Ага. Мы сделали сначала поле varchar(max) для хранения даты-времени Потом решили поменять его на datetime Хорошо бы было, если бы сервер сам сконвертировал все данные из одного типа в другой. Тут и сказке конец.Да в общем в этом ничего невероятного нету. Можно пытаться конвертить по умолчанию, можно ограничиться только родственными типами (например, менять date на datetime), можно к конструкции ALTER TYPE добавить выражения приведения данных при изменении типов. То есть это не то, что теоретически невозможно, просто МС увлекается всякими CLR и не увлекается совершенствованием реляционного ядра :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2013, 17:05 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
alexeyvg можно ограничиться только родственными типами (например, менять date на datetime) вот хотя бы это, с возможностью явно запретить/разрешить усечение данных. и уже бы пользы от типов было гораздо больше ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2013, 17:10 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
alexeyvgТо есть это не то, что теоретически невозможно, просто МС увлекается всякими CLR и не увлекается совершенствованием реляционного ядра :-) Мне кажется, что правильное проектирование схемы не является функцией ядра. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2013, 17:14 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
alexeyvgнапример, менять date на datetime То есть поменять 3-байтовый тип данных на 8-байтовый? Как это должно выглядеть для той же таблицы на 100 млн. записей? :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2013, 17:32 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
GloryalexeyvgТо есть это не то, что теоретически невозможно, просто МС увлекается всякими CLR и не увлекается совершенствованием реляционного ядра :-) Мне кажется, что правильное проектирование схемы не является функцией ядра.Это не проектирование, а изменение модели данных. Модель данных в MSSQL менять допускается, например, для таблиц разрешены ALTER TABLE, можно менять, удалять, добавлять колонки. Я, честно говоря, не вижу разницы в изменении типа так, как я описал выше, и том же самом изменении, сделанном непоследственно в таблице. Гость333alexeyvgнапример, менять date на datetime То есть поменять 3-байтовый тип данных на 8-байтовый? Как это должно выглядеть для той же таблицы на 100 млн. записей? :-)Да в общем не так это сложно, учитывая, что это можно делать не немедленно. Но это так, лирическое отступление. Уж точно это не сложнее (и не проще), чем поменять date на datetime непосредственно в таблице, что сейчас разрешено (и было разрешено всегда). То есть просто думать надо перед выполнением таких действий, но тем не менее потенциальная длительность изменений и ресурсы, которые на это потребуются, не повод не делать такую функциональность или запрещать существующую (ALTER TABLE). ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2013, 18:25 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
GloryВ том, что не позволяет, например, программеру "фантизировать" с длиной параметра. Т.е. не будет программера заботить, что там varchar(100) или varchar(200) определен для Address. Он будет писать declare @x AddressКак раз в третьем манифесте это тоже было поднято. Т.е. можно возразить: - сделай таблицу "Адрес" - таблица с одной колонкой? - сейчас одна, завтра сложная структура ... Вот именно, что язык не позволяет манипулировать "отрывом колонки" от сущности и общим описанием "отношения". Привет "Tutorial D". По сути мы этого и хотим, что данные как бы во многих таблах, а с другой словно всё в одной. Это не вписывает в текущую реализацию скуля. (Возможно в Tutorial D можно и обновлять (update) данные сразу по всему отношению, привязанные к объектам разного типа - читать "в разных таблах"). Думаю, что для MS не слишком сложно сделать ALTER TYPE для SPARSE колонок и Column-Store таблиц. Но в том-то и проблема, что на практике всё строчное и фича малоприменима. А с другой стороны, со всеми оптимизациями, аля секционирование - не так это всё просто, по одной колонке заменять. У PostreSQL это проще - там таблицы можно наследовать и на этом строится секционирование. Поменял в базовой и всё, везде поменялось (не пробывал). ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2013, 20:43 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
Используем типы только в ДБ проекте, да и то, достаточно ограниченно. При развёртывании проекта UDT приеобразуются в базовые типы и на этом уходят в эксплуатацию. По поводу UDTT, что pkarklin написал - да, это удобно, но это другая немного песня. Очень хотелось бы узнать точку зрения Crimean. Из своего опыта - ничего полезного из пользовательских типов не вынес проблем от пользовательских типов больше, чем предоставляемых ими преимуществ. Основные - проблемы в случае, когда тип по тем или иным причинам перестаёт удовлетворять требованиям, или неудобства, когда там, где можно было бы использовать короткий numeric/decimal втыкают UDT с базовым типом большего размера "просто для однообразия". ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2013, 23:02 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
любитель типовИспользуем типы только в ДБ проекте, да и то, достаточно ограниченно. При развёртывании проекта UDT приеобразуются в базовые типы и на этом уходят в эксплуатацию. По поводу UDTT, что pkarklin написал - да, это удобно, но это другая немного песня. Очень хотелось бы узнать точку зрения Crimean. Из своего опыта - ничего полезного из пользовательских типов не вынес проблем от пользовательских типов больше, чем предоставляемых ими преимуществ. Основные - проблемы в случае, когда тип по тем или иным причинам перестаёт удовлетворять требованиям, или неудобства, когда там, где можно было бы использовать короткий numeric/decimal втыкают UDT с базовым типом большего размера "просто для однообразия".Забыл добавить - CLR типы действительно удообная штука. Не то, чтобы широко это дело у нас использовалось, но есть пара мест, весьма к месту пришлись. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2013, 23:05 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
alexeyvgДа в общем не так это сложно, учитывая, что это можно делать не немедленно. Но это так, лирическое отступление. Уж точно это не сложнее (и не проще), чем поменять date на datetime непосредственно в таблице, что сейчас разрешено (и было разрешено всегда). То есть просто думать надо перед выполнением таких действий, но тем не менее потенциальная длительность изменений и ресурсы, которые на это потребуются, не повод не делать такую функциональность или запрещать существующую (ALTER TABLE). Предположим, что у меня 1 тип использован в 100 таблицах. Что будет, если в 99 таблицах автоматическая смена типа пройдет удачно, а в 100ой обломится ? Кто будет отвечать за логическую целостность ? Если ядро, то оно сможет сделать это только через транзакцию. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2013, 09:08 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
GloryalexeyvgДа в общем не так это сложно, учитывая, что это можно делать не немедленно. Но это так, лирическое отступление. Уж точно это не сложнее (и не проще), чем поменять date на datetime непосредственно в таблице, что сейчас разрешено (и было разрешено всегда). То есть просто думать надо перед выполнением таких действий, но тем не менее потенциальная длительность изменений и ресурсы, которые на это потребуются, не повод не делать такую функциональность или запрещать существующую (ALTER TABLE). Предположим, что у меня 1 тип использован в 100 таблицах. Что будет, если в 99 таблицах автоматическая смена типа пройдет удачно, а в 100ой обломится ? Кто будет отвечать за логическую целостность ? Если ядро, то оно сможет сделать это только через транзакцию.Да, через транзакцию. Как можно решить эту же бизнес-задачу сейчас? Открыть транзакцию, и сделать 100 раз ALTER TABLE для этих таблиц. Так что в общем то же самое. Но конечно вариант без "типа" более гибкий - я могу делать эти же операции частями, забив на целостность, управляя целостностью вручную и полностью забив на атомарность этой операции. Соответственно, можно было бы предусмотреть в варианте ALTER TYPE 2 режима - атомарный и не атомарный. В первом случае операция выполяется или не выполняется целиком, откатываясь после первой же ошибки, во втором выполняется для тех таблиц, где это получилось, возвращая ошибки. Ну и понятно, изменение модели - исключительный случай, нужно будет предусматривать "окно" для изменений, общем не такое простое дело. С другой стороны, есть масса случаев, когда на такой операции не может произойти ошибок, кроме общесистемных (например, кончилось место). Кроме того, для таких операций (где не может произойти ошибок, кроме общесистемных) МС часто предусматривает асинхронное выполнение. Возьмите к примеру добавление NULL поля в таблицу - это даже для большой таблицы выполняется моментально, потому что физическое изменение страницы откладывается на момент изменения страницы какой либо обновляющей операцией. Вот и здесь - при изменении "типа" в некоторых случаях можно использовать этот режим. Например, менять varchar(100) на varchar(200) или varchar(100) на nvarchar(100) можно соверешнно безопасно в отложенном режиме, так что для 100 огромных таблиц это займёт милисекунды. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2013, 10:41 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
alexeyvgСоответственно, можно было бы предусмотреть в варианте ALTER TYPE 2 режима - атомарный и не атомарный. ... во втором выполняется для тех таблиц, где это получилось, возвращая ошибки. Это будет какой-то странный режим. Что получится в итоге? В таблице_1 есть столбец с типом МойТип, и в таблице_2 есть столбец с типом МойТип. Но при этом для таблицы_1 МойТип = int, а для таблицы_2 МойТип = bigint? Или вы имели в виду что-то другое? alexeyvgНапример, менять varchar(100) на varchar(200) можно соверешнно безопасно в отложенном режиме, так что для 100 огромных таблиц это займёт милисекунды. true alexeyvgНапример, менять varchar(100) на nvarchar(100) можно соверешнно безопасно в отложенном режиме, так что для 100 огромных таблиц это займёт милисекунды. false Изменение типа в данном случае будет как на уровне метаданных, так и на уровне данных. В целом согласен, что конструкцию ALTER TYPE вполне можно было бы сделать. Вот, кстати, нашёлся запрос этой фичи на Коннекте, но у Microsoft'а нет ресурсов для её реализации: http://connect.microsoft.com/SQLServer/feedback/details/319134/msft-mso-support-alter-type Thank you for submitting this suggestion, but given its priority relative to the many other items in our queue, it is unlikely that we will actually complete it. As such, we are closing this suggestion as “won’t fix”. Please consider using tool like Visual Studio or SQL Studio to refactor your types. They will handle the renames including reference inside module definitions. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2013, 11:05 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
alexeyvgДа, через транзакцию. Как можно решить эту же бизнес-задачу сейчас? Открыть транзакцию, и сделать 100 раз ALTER TABLE для этих таблиц. Так что в общем то же самое. Но конечно вариант без "типа" более гибкий - я могу делать эти же операции частями, забив на целостность, управляя целостностью вручную и полностью забив на атомарность этой операции. Ваши примеры для очень простых случаев Даже ALTER TABLE не позволяет изменять тип и размерность поля, например, для поля Used in a PRIMARY KEY or [FOREIGN KEY] REFERENCES constraint. и еще куча ограничений Если ввести еще ваши ограничения, то по-моему останется только такие изменения, которые затрагивают только метаданные, а не сами данные Т.е. varchar(100) на varchar(200) . А вот varchar(200) на varchar(100) - уже нет ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2013, 12:51 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
alexeyvgпредусмотреть в варианте ALTER TYPE 2 режима - атомарный и не атомарный.К примеру у FOREGN KEY есть 2 управляющих свойства, точнее 3 состояния (WITH [NOT] CHECK [NOT] CHECK). Когда он отключён, включён для изменяемых данных и включён и проверен для всех данных. Если экстраполироать, то можно не только менять VarChar(200) -> VarChar(100) в отложенном режиме, но и так всю схему бд. Кстати, понял в чём MS проффтыкала. Она могла мульти-схемность таблицы не только на DEFAULT-ы распространить, а на всё. При этом не нужно менять схему БД, уже всё заложено в структуры. Тогда можно сделать ассинхронный CHECK на что угодно, и на DEFAULT и на FOREIGN KEY и на CHECK, а далее на колонки. Притом прерываемый: если не все страницы проверил и прервался, то можно продолжить позже. Но с колонками загвоздка - есть описание текущее и последующее, а с констрейнтами всё проще, предыдущее состояния нет (отсутствие ограничения). Для INSERT/UPDATE новое описание, но определение колонок всё ещё старое. В текущее INFORMATION_SCHEMA это не вписывается. Как это экстраполировать на TYPE. Т.к. уже у таблиц есть несколько внутренних описаний структуры (версий) и в страницах хранится код структуры (версии). То также сделать в типах, и версиях таблиц прописывать не тип, а его версию. Для всех переменных всегда берётся последняя версия тип. При вставке/изменении данных всегда ставится последняя версия. Но при переключении секций может свалится в ошибку - "Таблицы содержит несколько версий метаданных. Проведите CHECK или UPDATE для устранения этой ошибки". ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2013, 16:09 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
Ещё один логический баг/недоработка со стороны MS: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2013, 16:30 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
Mniorуже у таблиц есть несколько внутренних описаний структуры (версий) и в страницах хранится код структуры (версии) Где можно почитать об этом? Или в какую часть вывода DBCC PAGE посмотреть, чтобы увидеть код структуры? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2013, 16:43 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
Гость333Mniorуже у таблиц есть несколько внутренних описаний структуры (версий) и в страницах хранится код структуры (версии)Где можно почитать об этом? Или в какую часть вывода DBCC PAGE посмотреть, чтобы увидеть код структуры? Вот еле нашёл, но перечитывать сейчас времени нет. Проверьте пожалуйста, не проффтыкал ли я. Может там механизм всётаки другой. Где-то, я помню что был случай когда не просто создаётся колонка, но и изменяется DEFAULT. Т.е. как бы их два, один для тех страниц которые не обновлены, другие для текущих вставок. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2013, 21:17 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
GloryДаже ALTER TABLE не позволяет изменять тип и размерность поля, например, для поля Used in a PRIMARY KEY or [FOREIGN KEY] REFERENCES constraint. и еще куча ограниченийДа, ALTER TABLE не позволяет, так идея в том, чтобы для ALTER TYPE позволяло, ведь тип будет изменён везде, так что REFERENCES constraint не пострадают. GloryЕсли ввести еще ваши ограничения, то по-моему останется только такие изменения, которые затрагивают только метаданные, а не сами данные Т.е. varchar(100) на varchar(200) . А вот varchar(200) на varchar(100) - уже нетДа в общем разные могут быть подходы; по крайней мере это тема для обсуждения, ИМХО не такая плохая идея. По крайней мере, в транзакции всё можно поменять, хоть метаданные, хоть данные... Т.е. ограничения касаются только выбора механизма изменений типа, быстрый или медленный. MniorТ.к. уже у таблиц есть несколько внутренних описаний структуры (версий) и в страницах хранится код структуры (версии). То также сделать в типах, и версиях таблиц прописывать не тип, а его версию.Да, я собственно это и имел в виду. Такой способ, понятно, годится только для безусловно совместимых изменений, но это уже что то, можно будет хоть int на bigint поменять быстро, без ожиданий... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2013, 21:26 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
alexeyvgДа, я собственно это и имел в виду.Вы думаете мы всё продумали и можем уже предлагать MS? Мне кажется мы возможно не учли какой-то логичной фишки, которая не лежит на поверхности, но мешает это сделать. Надо искать подводные камни. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2013, 22:20 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
MnioralexeyvgДа, я собственно это и имел в виду.Вы думаете мы всё продумали и можем уже предлагать MS? Мне кажется мы возможно не учли какой-то логичной фишки, которая не лежит на поверхности, но мешает это сделать. Надо искать подводные камни.Думаю, всё учли :-) https://connect.microsoft.com/SQLServer/feedback/details/319134/msft-mso-support-alter-type ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2013, 00:06 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
Mnior Гость333Где можно почитать об этом? Вот еле нашёлСобственно на русском . И всё крутится над Внутренними системными представлениями Но вот только так и не понятен принцип. LSN (или TimeStamp/RowVersion) конечно логично, но это не версия, точнее если не меняется весь PAGE, а только строка, то мои изыскания бесплодны. 1. Версия метаданных должна иметь свой LSN 2. Если табла имеет более одной версии, она должна сравнивать LSN последней с LSN страницы и если она больше (Ver>Page), то обновлять всю страницу - что уже жутко: а) блокировки + а какжетюниги - запрет на локировку страниц, а также неизбежное расщепление строк (при DEFAULT) б) возможно нарушение логики (ХЗ) в) скрытое обновление строк может потребовать изменение внутрених механизмов (не обновлять RowVersion). Но с другой стороны - добавление колонки это изменение строки или нет? 3. В случае CHECK ONLINE данные то не меняются - получается что, надо изменять LSN, хотя при этом данные вообще не меняются? (на странице нужно поставить новый LSN, т.к. на ней меняется LSN ) Писать ради этого в журнал страницу бесмысленно. Получается нужно расширять словарь лога? Это батхерт. Надо протестить случай с изменением DEFAULT (удаление его, создание нового с другим значением). alexeyvg MSFT-MSO: Support ALTER TYPE Кул. Но есть ли смысл голосовать за закрытый репорт 2007 года? И там описан случай при логической совместимости (увеличение Var Char, это уже о-го-го). Случай CHECK ONLINE (что я описывал) не рассматривается, а зря. Т.к. с этим можно покрыть почти все изменения. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2013, 01:21 |
|
User-Defined Data Types & Rules
|
|||
---|---|---|---|
#18+
Хочу немного описать случай несовместимого изменения (VarChar(200) -> VarChar(100) или BigInt -> Int). Некоторым может показаться сложновато. Это изменение можно разбить на три других: 1) Добавление NOCHECK CONSTRAINT (DataLength([ColChar200]) <= 100 или [ColBigInt] <= MaxInt) - делается мгновенно 2) CHECK CONSTRAINT ONLINE (долго но без останова) 3) Наличие IsTrasted CONSTRAINT-а делает замену типа совместимой - и делается мгновенно. Стратегия . Можно завести разные Suggestion-ы на connection, а далее уже MS не отмажется. 1. Уже работает 2. Уже заведён (но какого хера они его втихаря прикрыли, %и%а%а%сы!) Всё равно голосоум! Как кстати и на "Support ALTER TYPE". 3. Не нашёл, надо видимо писать. На самом деле 3й пункт юзабильный не менее чем 2й. Т.к. можно это расширить на любой уровень - к примеру: Создание другого ограничения, который гарантированно выполняется из-за сущесвующего(их). Это например полезно для каскадного смягчения требований без повторных сканов таблицы. У меня это было нужно несколько раз на продакшине. Кстати, это работает в обоих направлениях. Можно как разьединять ограничения так и соединять в один: (Check(A) OR ID < 1000) + (Check(A) OR ID >= 1000) + (ID NOT NULL) <--> Check(A). Это также можно экстраполировать как псевдо CHECK ONLINE - маленькими кусочками. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2013, 02:00 |
|
|
start [/forum/topic.php?fid=46&msg=38240301&tid=1707216]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
156ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
others: | 241ms |
total: | 509ms |
0 / 0 |