powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / User-Defined Data Types & Rules
24 сообщений из 49, страница 2 из 2
User-Defined Data Types & Rules
    #38240292
trew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glory,

Спасибо, понятно.
А было бы удобно, если бы такая возможность была.
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38240301
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
trewА было бы удобно, если бы такая возможность была.
Ага.
Мы сделали сначала поле varchar(max) для хранения даты-времени
Потом решили поменять его на datetime
Хорошо бы было, если бы сервер сам сконвертировал все данные из одного типа в другой.

Тут и сказке конец.
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38240352
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость333,

Не пробовал, страшно :-) напрямую вообще сторонними дизайнерами не трогаю. Но уверен, что не сможет
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38240353
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GlorytrewА было бы удобно, если бы такая возможность была.
Ага.
Мы сделали сначала поле varchar(max) для хранения даты-времени
Потом решили поменять его на datetime
Хорошо бы было, если бы сервер сам сконвертировал все данные из одного типа в другой.

Тут и сказке конец.Да в общем в этом ничего невероятного нету.

Можно пытаться конвертить по умолчанию, можно ограничиться только родственными типами (например, менять date на datetime), можно к конструкции ALTER TYPE добавить выражения приведения данных при изменении типов.

То есть это не то, что теоретически невозможно, просто МС увлекается всякими CLR и не увлекается совершенствованием реляционного ядра :-)
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38240371
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg можно ограничиться только родственными типами (например, менять date на datetime)
вот хотя бы это, с возможностью явно запретить/разрешить усечение данных. и уже бы пользы от типов было гораздо больше
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38240381
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgТо есть это не то, что теоретически невозможно, просто МС увлекается всякими CLR и не увлекается совершенствованием реляционного ядра :-)
Мне кажется, что правильное проектирование схемы не является функцией ядра.
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38240434
Гость333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgнапример, менять date на datetime
То есть поменять 3-байтовый тип данных на 8-байтовый? Как это должно выглядеть для той же таблицы на 100 млн. записей? :-)
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38240545
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GloryalexeyvgТо есть это не то, что теоретически невозможно, просто МС увлекается всякими CLR и не увлекается совершенствованием реляционного ядра :-)
Мне кажется, что правильное проектирование схемы не является функцией ядра.Это не проектирование, а изменение модели данных.
Модель данных в MSSQL менять допускается, например, для таблиц разрешены ALTER TABLE, можно менять, удалять, добавлять колонки.

Я, честно говоря, не вижу разницы в изменении типа так, как я описал выше, и том же самом изменении, сделанном непоследственно в таблице.
Гость333alexeyvgнапример, менять date на datetime
То есть поменять 3-байтовый тип данных на 8-байтовый? Как это должно выглядеть для той же таблицы на 100 млн. записей? :-)Да в общем не так это сложно, учитывая, что это можно делать не немедленно. Но это так, лирическое отступление.

Уж точно это не сложнее (и не проще), чем поменять date на datetime непосредственно в таблице, что сейчас разрешено (и было разрешено всегда). То есть просто думать надо перед выполнением таких действий, но тем не менее потенциальная длительность изменений и ресурсы, которые на это потребуются, не повод не делать такую функциональность или запрещать существующую (ALTER TABLE).
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38240676
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GloryВ том, что не позволяет, например, программеру "фантизировать" с длиной параметра.
Т.е. не будет программера заботить, что там varchar(100) или varchar(200) определен для Address.
Он будет писать declare @x AddressКак раз в третьем манифесте это тоже было поднято.

Т.е. можно возразить:
- сделай таблицу "Адрес"
- таблица с одной колонкой?
- сейчас одна, завтра сложная структура ...

Вот именно, что язык не позволяет манипулировать "отрывом колонки" от сущности и общим описанием "отношения".
Привет "Tutorial D".

По сути мы этого и хотим, что данные как бы во многих таблах, а с другой словно всё в одной.
Это не вписывает в текущую реализацию скуля.
(Возможно в Tutorial D можно и обновлять (update) данные сразу по всему отношению, привязанные к объектам разного типа - читать "в разных таблах").

Думаю, что для MS не слишком сложно сделать ALTER TYPE для SPARSE колонок и Column-Store таблиц. Но в том-то и проблема, что на практике всё строчное и фича малоприменима.

А с другой стороны, со всеми оптимизациями, аля секционирование - не так это всё просто, по одной колонке заменять.
У PostreSQL это проще - там таблицы можно наследовать и на этом строится секционирование. Поменял в базовой и всё, везде поменялось (не пробывал).
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38240767
Используем типы только в ДБ проекте, да и то, достаточно ограниченно. При развёртывании проекта UDT приеобразуются в базовые типы и на этом уходят в эксплуатацию.
По поводу UDTT, что pkarklin написал - да, это удобно, но это другая немного песня.

Очень хотелось бы узнать точку зрения Crimean. Из своего опыта - ничего полезного из пользовательских типов не вынес проблем от пользовательских типов больше, чем предоставляемых ими преимуществ. Основные - проблемы в случае, когда тип по тем или иным причинам перестаёт удовлетворять требованиям, или неудобства, когда там, где можно было бы использовать короткий numeric/decimal втыкают UDT с базовым типом большего размера "просто для однообразия".
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38240772
любитель типовИспользуем типы только в ДБ проекте, да и то, достаточно ограниченно. При развёртывании проекта UDT приеобразуются в базовые типы и на этом уходят в эксплуатацию.
По поводу UDTT, что pkarklin написал - да, это удобно, но это другая немного песня.

Очень хотелось бы узнать точку зрения Crimean. Из своего опыта - ничего полезного из пользовательских типов не вынес проблем от пользовательских типов больше, чем предоставляемых ими преимуществ. Основные - проблемы в случае, когда тип по тем или иным причинам перестаёт удовлетворять требованиям, или неудобства, когда там, где можно было бы использовать короткий numeric/decimal втыкают UDT с базовым типом большего размера "просто для однообразия".Забыл добавить - CLR типы действительно удообная штука. Не то, чтобы широко это дело у нас использовалось, но есть пара мест, весьма к месту пришлись.
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38240943
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgДа в общем не так это сложно, учитывая, что это можно делать не немедленно. Но это так, лирическое отступление.

Уж точно это не сложнее (и не проще), чем поменять date на datetime непосредственно в таблице, что сейчас разрешено (и было разрешено всегда). То есть просто думать надо перед выполнением таких действий, но тем не менее потенциальная длительность изменений и ресурсы, которые на это потребуются, не повод не делать такую функциональность или запрещать существующую (ALTER TABLE).
Предположим, что у меня 1 тип использован в 100 таблицах.
Что будет, если в 99 таблицах автоматическая смена типа пройдет удачно, а в 100ой обломится ?
Кто будет отвечать за логическую целостность ?
Если ядро, то оно сможет сделать это только через транзакцию.
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38241099
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 огромных таблиц это займёт милисекунды.
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38241131
Гость333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38241332
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgДа, через транзакцию.

Как можно решить эту же бизнес-задачу сейчас? Открыть транзакцию, и сделать 100 раз ALTER TABLE для этих таблиц.

Так что в общем то же самое. Но конечно вариант без "типа" более гибкий - я могу делать эти же операции частями, забив на целостность, управляя целостностью вручную и полностью забив на атомарность этой операции.
Ваши примеры для очень простых случаев

Даже ALTER TABLE не позволяет изменять тип и размерность поля, например, для поля
Used in a PRIMARY KEY or [FOREIGN KEY] REFERENCES constraint.
и еще куча ограничений
Если ввести еще ваши ограничения, то по-моему останется только такие изменения, которые затрагивают только метаданные, а не сами данные
Т.е. varchar(100) на varchar(200) . А вот varchar(200) на varchar(100) - уже нет
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38241827
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 для устранения этой ошибки".
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38241866
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё один логический баг/недоработка со стороны MS:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
USE [tempdb]

CREATE TABLE [dbo].[Test] ([Data] Int NOT NULL PRIMARY KEY)
INSERT dbo.Test VALUES (-1),(1),(2),(3),(4)
ALTER TABLE [dbo].[Test] WITH NOCHECK ADD CONSTRAINT [CK_Test] CHECK ([Data] > 0)
GO
UPDATE dbo.Test SET Data *= -1 WHERE Data = 2	-- The UPDATE statement conflicted with the CHECK constraint "CK_Test"
GO
	SELECT is_not_trusted FROM sys.check_constraints WHERE name = 'CK_Test'	-- 1
DELETE dbo.Test WHERE Data = -1
	SELECT is_not_trusted FROM sys.check_constraints WHERE name = 'CK_Test'	-- 1
UPDATE dbo.Test SET Data = Data							-- Не устраняет is_not_trusted, хотя затрагивает все данные (а они проверяются, в плане видно)
	SELECT is_not_trusted FROM sys.check_constraints WHERE name = 'CK_Test'	-- 1
ALTER TABLE [dbo].[Test] WITH CHECK CHECK CONSTRAINT [CK_Test];
	SELECT is_not_trusted FROM sys.check_constraints WHERE name = 'CK_Test'	-- 0
GO
DROP TABLE [dbo].[Test]
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38241901
Гость333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mniorуже у таблиц есть несколько внутренних описаний структуры (версий) и в страницах хранится код структуры (версии)
Где можно почитать об этом? Или в какую часть вывода DBCC PAGE посмотреть, чтобы увидеть код структуры?
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38242202
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость333Mniorуже у таблиц есть несколько внутренних описаний структуры (версий) и в страницах хранится код структуры (версии)Где можно почитать об этом? Или в какую часть вывода DBCC PAGE посмотреть, чтобы увидеть код структуры? Вот еле нашёл, но перечитывать сейчас времени нет. Проверьте пожалуйста, не проффтыкал ли я. Может там механизм всётаки другой.

Где-то, я помню что был случай когда не просто создаётся колонка, но и изменяется DEFAULT. Т.е. как бы их два, один для тех страниц которые не обновлены, другие для текущих вставок.
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38242208
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 поменять быстро, без ожиданий...
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38242255
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgДа, я собственно это и имел в виду.Вы думаете мы всё продумали и можем уже предлагать MS?
Мне кажется мы возможно не учли какой-то логичной фишки, которая не лежит на поверхности, но мешает это сделать.
Надо искать подводные камни.
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38242349
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MnioralexeyvgДа, я собственно это и имел в виду.Вы думаете мы всё продумали и можем уже предлагать MS?
Мне кажется мы возможно не учли какой-то логичной фишки, которая не лежит на поверхности, но мешает это сделать.
Надо искать подводные камни.Думаю, всё учли :-)

https://connect.microsoft.com/SQLServer/feedback/details/319134/msft-mso-support-alter-type
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38242399
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 (что я описывал) не рассматривается, а зря. Т.к. с этим можно покрыть почти все изменения.
...
Рейтинг: 0 / 0
User-Defined Data Types & Rules
    #38242410
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу немного описать случай несовместимого изменения (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 - маленькими кусочками.
...
Рейтинг: 0 / 0
24 сообщений из 49, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / User-Defined Data Types & Rules
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]