|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
Добрый день, джентельмены! Наставьте на путь истинный... Есть в таблице два поля типа date DateBegin и DateEnd, которые означают дату начала работы (например) и дату окончания работы. Поле DateBegin не может принимать значение NULL, что отражено в конструкторе таблиц и не может быть ранее, допустим 01.01.2017. Поле DateEnd может принимать значение как NULL, так и некоторое значение даты, которая должна быть более (или равна) дате начала работы, но не более конечной даты. Настиг вопрос, как написать правильные ограничения на столбцы дат. 1) Вставляю в поле ограничения для DateBegin следующее ([fValDateBegin]>='2017-01-01' AND [fValDateBegin]<'2050-01-01') 2) Вставляю в поле ограничения для DateEnd следующее ([fValDateEnd]=NULL OR [fValDateEnd]>='2017-01-01' AND [fValDateEnd]<'2050-01-01') Получаю ошибку при сохранении... И попутный вопрос, как при вставке контролировать, чтобы дата начала работ была меньше или равна дате окончания работ (на уровне записи, с учетом NULL в поле DateEnd)? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2020, 17:44 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
edward_shПолучаю ошибку при сохранении...Чтобы исправить неизвестную ошибку, нужны неизвестные действия.edward_sh[fValDateEnd]=NULLДля проверки значения на null надо использовать оператор is null / is not nulledward_shИ попутный вопрос, как при вставке контролировать, чтобы дата начала работ была меньше или равна дате окончания работ (на уровне записи, с учетом NULL в поле DateEnd)?Создать соответствующий check constraint. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2020, 18:24 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
edward_sh что отражено в конструкторе таблиц Пользоваться скриптами SQL и выполнять оные. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2020, 18:31 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
имхо, построитель глючит попробуйте sql (логику не проверял) типа: ALTER TABLE [dbo].[Tab] add CONSTRAINT CHK_Column CHECK ([fValDateBegin]>='2017-01-01' AND [fValDateBegin]<'2050-01-01'), CONSTRAINT CHK_Column2 CHECK ([fValDateEnd]=NULL OR ([fValDateEnd]>='2017-01-01' AND [fValDateEnd]<'2050-01-01')) Go ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2020, 20:56 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
godsql имхо, построитель глючит да щас ) скорее у автора есть данные, не подпадающие под прописанные ограничения ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2020, 21:40 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
godsql имхо, построитель глючит попробуйте sql (логику не проверял) типа: ALTER TABLE [dbo].[Tab] add CONSTRAINT CHK_Column CHECK ([fValDateBegin]>='2017-01-01' AND [fValDateBegin]<'2050-01-01'), CONSTRAINT CHK_Column2 CHECK ([fValDateEnd]=NULL OR ([fValDateEnd]>='2017-01-01' AND [fValDateEnd]<'2050-01-01')) Go ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2020, 23:41 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
пробовал и такую конструкцию как fValDateEnd is null Результат был тот же самый. При попытке сохранить результаты правки, выходит сообщение, что текст ограничения содержит ошибки. В Accesse есть возможность на каждое нарушение ограничения вывести свое соощение (в чем конкретно ошибка). В SQL так понимаю такого нет? Очень неинформативное сообщение о нарушении данных в ограничении ХХХХ базы такой-то. Данные в столбцах таковы fValDateBegin = 2017-01-01, fValDateEnd = NULL во всех записях. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2020, 07:05 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
edward_sh пробовал и такую конструкцию как fValDateEnd is null Результат был тот же самый. При попытке сохранить результаты правки, выходит сообщение, что текст ограничения содержит ошибки. В Accesse есть возможность на каждое нарушение ограничения вывести свое соощение (в чем конкретно ошибка). В SQL так понимаю такого нет? Очень неинформативное сообщение о нарушении данных в ограничении ХХХХ базы такой-то. А то в вашем посте вы уже рассказали про 2 версии сообщения об ошибке: 1) ошибка в тексте ограничения 2) ошибка в данных таблицы Неужели трудно просто скопировать? edward_sh Данные в столбцах таковы fValDateBegin = 2017-01-01, fValDateEnd = NULL во всех записях. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2020, 09:04 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
edward_sh пробовал и такую конструкцию как fValDateEnd is null А то у вас множество ошибок накладываются друг на друга, и отлаживать очень трудно. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2020, 09:05 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
Конструктор таблиц упорно не хотел сохранять ограничения, вопя об ошибке сохранения. Убил эти ограничения и через ALTER все прекрасно сохранилось. Попутно возник вопрос - у меня несколько таблиц, в которых содержатся аналогичные поля, на которые накладываются аналогичные ограничения. Есть ли возможность создать ОДНО ограничение для каждого столбца и применить его к разным таблицам? Или лучше вынести проверку корректности данных в функцию и применять ее через триггер? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2020, 09:31 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
iap godsql имхо, построитель глючит попробуйте sql (логику не проверял) типа: ALTER TABLE [dbo].[Tab] add CONSTRAINT CHK_Column CHECK ([fValDateBegin]>='2017-01-01' AND [fValDateBegin]<'2050-01-01'), CONSTRAINT CHK_Column2 CHECK ([fValDateEnd]=NULL OR ([fValDateEnd]>='2017-01-01' AND [fValDateEnd]<'2050-01-01')) Go согласен :) Скобки поправил в логике, а здесь не исправил :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2020, 12:09 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
godsql iap пропущено... Что по-вашему вернёт [fValDateEnd]=NULL ?? согласен :) Скобки поправил в логике, а здесь не исправил :) https://docs.microsoft.com/ru-ru/sql/t-sql/language-elements/null-and-unknown-transact-sql?view=sql-server-2017 В констрейнте CHECK надо, чтобы выражение не вернуло FALSE. В отличие от выражений в WHERE или ON, которые пропускают только записи, для которых получается TRUE. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2020, 12:23 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
edward_sh Убил эти ограничения и через ALTER все прекрасно сохранилось. Ну ды щаз, конечно! Ты просто создал недоверенный констрейнт. Теперь проверь его! Код: sql 1.
:-) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2020, 21:46 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
Alter table myTable With Check Check constraint myConstraint Command(s) completed successfully. Изменение в поле fValDateBegin (заранее неверное при ограничении) выдает ошибку вставки записи из-за сработавшего ограничения на поле. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2020, 07:33 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
Самое интересное, что если у поля поменять тип с date на datetime, ошибок SSMS при сохранении этого же ограничения не происходит. Интересно, в чем фикус? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2020, 18:32 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
edward_sh, условие проверки выполняется, какой тут фокус может быть. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2020, 19:10 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
Добрый день,Владислав Колосов! Не понятно, почему при работе в SSMS с полем типа datetime не вылетает ошибка, а при типе поля date появляется? И попутный вопрос - не могу для себя выяснить правильное направление движения. Использовать ли ограничения на значение столбцах или же использовать триггер? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2020, 15:10 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
edward_sh, вылетает ошибка потому, что переданные значения не проходят проверку. Проверяйте формулу применительно к значению простым запросом. Уберите дефисы из строки даты, в таком написании дата трактуется неоднозначно, зависит от установленного языка сессии. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2020, 15:44 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
Владислав Колосов, по Вашему совету убрал дефисы (хотя читал, что это тоже универсальный формат даты, не зависящий от языка) ([fValDateEnd] IS NULL OR [fValDateEnd]>='20170101' AND [fValDateEnd]<'20500101') Все равно при сохранении вылетает ошибка "Error validating constraint. Do you want to edit..." При смене на тип datetime этой ошибки нет, как впрочем и при вставке через командную строку... А по второй части вопроса можете что-нибудь посоветовать? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2020, 16:50 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
edward_sh Использовать ли ограничения на значение столбцах или же использовать триггер? edward_sh Все равно при сохранении вылетает ошибка "Error validating constraint. Do you want to edit..." Повторю ещё раз: alexeyvg edward_shДанные в столбцах таковы fValDateBegin = 2017-01-01, fValDateEnd = NULL во всех записях. И пишите и выкладывайте скрипты, результаты выполнения, а то получается, как секретарша: "я что то нажала а он не работает что мне делать". ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2020, 17:11 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
edward_sh, Выполните запрос Код: sql 1.
, увидите, что мешает. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2020, 17:39 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
Выкладываю скрины.... Походу сервер не дает приложить файлы... И еще попутный вопрос .... У меня в нескольких таблицах в полях есть одинаковые ограничения на дату. Что лучше, прописывать ограничения для каждой таблицы или создать функцию, где эти ограничения прописаны и применить эту функцию к необходимым столбцам всех нужных таблиц? На всякий случай вывод @@Version Microsoft SQL Server 2008 R2 (SP3) - 10.50.6220.0 (X64) Mar 19 2015 12:32:14 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) Модератор: Вложение удалено. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2020, 18:41 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
edward_sh, Ваши картинки никому не нужны. Текст команд и текст ошибок достаточно скопировать через буфер обмена. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2020, 22:13 |
|
Создание ограниченя на столбец
|
|||
---|---|---|---|
#18+
edward_sh Что лучше, прописывать ограничения для каждой таблицы или создать функцию, где эти ограничения прописаны и применить эту функцию к необходимым столбцам всех нужных таблиц? Владислав Колосов edward_sh, Выполните запрос Код: sql 1.
, увидите, что мешает. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2020, 23:23 |
|
|
start [/forum/topic.php?fid=46&msg=39953667&tid=1685949]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
47ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 286ms |
total: | 442ms |
0 / 0 |