Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
mabanza Member Откуда: Сообщений: 194 |
Привет. При сохранении поля в MS SQL 2012, выбрасывается ошибка: String or binary data would be truncated. The statement has been terminated Ее происхождение очевидно: длина данных (строки), которые вставляются, больше чем длина поля в БД. Не очевидно только одно: а зачем такая проверка? В Первэзиве все проходит хорошо, поле обрезается, но сохраняется в БД. Как такое устроить в MS SQL, мне эта проверка не нужна? Спасибо |
20 дек 13, 02:26 [15320950] Ответить | Цитировать Сообщить модератору |
sdet Member Откуда: Сообщений: 463 |
Или вы увеличиваете длину поля, или уменьшаете строку до insert. Странно, что вам не очевидно, что вы можете потерять данные даже не узнав об этом |
||
20 дек 13, 02:47 [15320964] Ответить | Цитировать Сообщить модератору |
leov Member Откуда: С-Петербург Сообщений: 616 |
mabanza, не вполне уверен но вроде вот такое должно на это влиять SET ARITHABORT ON по крайней мере у меня поначалу хвосты сами отрезались а потом понадобилось вот такое добавить и полезли аналогичные ошибки с truncate пришлось строже валидацию везде прописывать |
20 дек 13, 04:45 [15321064] Ответить | Цитировать Сообщить модератору |
mabanza Member Откуда: Сообщений: 194 |
Я не теряю данные, если есть ограничение в доменной логике. Я пишу валидаторы, какие нужны по бизнес правилам, но не то, что диктует мне разработчик базы данных. Если завтра он изменит длину полей, я не должен изменять валидацию, перебилдивать, деплоить и всякая такая штука. Только если изменились бизнес-правила. Его длины полей - это его дело, а микрософт ставит меня в зависимость от среды, которая может иметь, а может и не иметь каких-либо огрничений. Странно, что вы считаете нормальной такую сильную связь клентской и серверной части. Это называется strong coupling и это хреновая практика. Тот же Pervasive более разумно поступает, оставляя программисту решать, считать ли длины полей частью бизнес логики или нет. Но это все переходит потихоньку в религиозные войны. А по-существу, я думаю это фикснуть в ORM mapper путем простого обрезания полей на основе метаданных из базы. Чтоб подстроиться под микрософт. Другого выхода, похоже, нет. Спасибо. |
20 дек 13, 04:54 [15321066] Ответить | Цитировать Сообщить модератору |
Ruuu Member Откуда: Иркутск Сообщений: 4272 |
SET ANSI_WARNINGS declare @t table(s varchar(5)) insert into @t values ('Barak Obama') select * from @t go declare @t table(s varchar(5)) set ANSI_WARNINGS OFF insert into @t values ('Vladimir Putin') select * from @t Только придумайте заранее, как будете объяснять пользователям, что данные которые они вбивали день/неделю/месяц/... сохранились только частично и нужно их перепроверить.
ЗЫ: можно вообще всё хранить в varchar(max) - типы данных придумали перестраховщики. |
||||
20 дек 13, 05:18 [15321073] Ответить | Цитировать Сообщить модератору |
Jaffar Member Откуда: Сообщений: 633 |
==> Странно, что вы считаете нормальной такую сильную связь клентской и серверной части. А если в базе данных не будет таблицы в которую вы пытаетесь вставить - субд тоже молча "проглатывать" должна? Ведь вас не волнует что там и как с базой - вы запрос отправили - а дальше проблемы базы, так? Если хотите чтобы все было совсем хорошо - то можно сделать пред_проверку длинны поля, посмотреть в системном представлении sys.columns длинну поля и если длинна реально вбитых данных больше - спросить пользователя что делать? |
20 дек 13, 06:53 [15321120] Ответить | Цитировать Сообщить модератору |
Ruuu Member Откуда: Иркутск Сообщений: 4272 |
|
||
20 дек 13, 07:34 [15321148] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31836 |
А вас не коробит эта хреновая практика "strong coupling" в вашем коде сервера приложений? Или у вас всё сделано так, что любому методу или свойству класса можно передать любой объект, и приложение (или компилятор) не ругнётся, а кое как обрежет, приведёт тип, в крайнем случае запишет дефолтное значение? Допустим, это у вас нормальная практика в коде приложения? : byte b = 1234567; |
||||
20 дек 13, 09:02 [15321307] Ответить | Цитировать Сообщить модератору |
StarikNavy Member Откуда: Москва Сообщений: 2397 |
Почему производитель устанавливает на машинах ремни безопасности? Мне они только мешают. Зачем такая сильная связь? |
20 дек 13, 10:00 [15321529] Ответить | Цитировать Сообщить модератору |
Jaffar Member Откуда: Сообщений: 633 |
Ruuu, ну если вы так боитесь что пользователь узнает длину поля в таблице - сделайте скалярную функцию, которая по имени табл. и поля возвращает длину. я не знаю нужны ли особые права на sys - можно сделать execute as dbo |
20 дек 13, 12:44 [15322551] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
если у юзера есть INSERT на таблицу, он увидит колонки этой таблицы в sys.columns без всякой выдачи специального "SELECT на этом системном представлении" |
||||
20 дек 13, 13:03 [15322685] Ответить | Цитировать Сообщить модератору |
Между сообщениями интервал более 1 года. |
andreymx Member Откуда: Запорожье Сообщений: 55404 |
Коллеги, а как увидеть, где ошибка свалилась, на какой таблице-колонке? Спасибо |
24 апр 17, 09:53 [20427813] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
может, напишете хоть, когда вываливается ошибка? как можно не знать, на какой таблице валится, вы во все таблицы базы что ли одно и то же льете и эту ошибку получаете? --- если это какой-то insert..select, сделайте selech max(len()) каждому бинарному/текстовому полю источника и посмотрите, где есть превышение размера поля приемника |
24 апр 17, 10:01 [20427846] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 55404 |
o-o, спасибо, как искать, я в курсе мне интересно, есть ли возможность получить это автоматом, не затрачивая время разраба |
24 апр 17, 10:11 [20427893] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6802 |
контролировать вставку? |
||
24 апр 17, 10:26 [20427959] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 55404 |
но я бы хотел запросить у системы, на чем она валится |
||||
24 апр 17, 10:28 [20427971] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6802 |
а у ясеня запросить? спрашивайте перед вставкой? проверяйте всю вставку... что значить запросить у сиситемы |
||||
24 апр 17, 10:33 [20427992] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 55404 |
TaPaK, не хочу срач разводить на тему - почему система не говорит, в каком поле валится ошибка Спасибо |
24 апр 17, 10:42 [20428026] Ответить | Цитировать Сообщить модератору |
НеРоботъ
Guest |
Oracle (не так давно) научилсяCREATE TABLE A(A NUMBER(1), b VARCHAR2(1)); insert into a(b) select rownum from dual connect by rownum < 12; ORA-12899: значение для столбца "Имя_Схемы"."A"."B" слишком велико (фактическое: 2, максимальное: 1) |
24 апр 17, 15:13 [20429603] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |