Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 не сохраняется constraint expression  [new]
x644444
Guest
sql2005x64.
на таблицу пишу constraint
(dic_id<>123 AND DOC_DATE<40177) OR (dic_id=123)
суть: на все dic_id (кроме 123) ограничить doc_date
сохраняю.открываю.вижу ерунду
([dic_id]<>(123) AND [DOC_DATE]<(40177) OR [dic_id]=(123))

менял местами условия - пофиг, логические скобки игнорируются, лог операторы ставятся последовательно. что скажете?
11 янв 10, 09:56    [8163631]     Ответить | Цитировать Сообщить модератору
 Re: не сохраняется constraint expression  [new]
Glory
Member

Откуда:
Сообщений: 104760
Предоставьте полный скрипт создания таблицы
11 янв 10, 10:03    [8163664]     Ответить | Цитировать Сообщить модератору
 Re: не сохраняется constraint expression  [new]
авторсообщения
Guest
Glory,
/****** Object:  Table [dbo].[TR_DOC]    Script Date: 01/11/2010 10:08:56 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TR_DOC](
	[DOC_ID] [int] NOT NULL,
	[DOC_DATE] [int] NOT NULL,
	[RAZ_ID1] [int] NOT NULL,
	[RAZ_ID2] [int] NOT NULL,
	[DIC_ID] [int] NOT NULL,
	[CR_PRS_ID] [int] NOT NULL,
 CONSTRAINT [PK_TR_DOC] PRIMARY KEY CLUSTERED 
(
	[DOC_DATE] ASC,
	[DIC_ID] ASC,
	[DOC_ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'ID объекта' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'TR_DOC', @level2type=N'COLUMN',@level2name=N'DOC_ID'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Дата документа. Только целая часть' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'TR_DOC', @level2type=N'COLUMN',@level2name=N'DOC_DATE'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Принадлежность документа №1' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'TR_DOC', @level2type=N'COLUMN',@level2name=N'RAZ_ID1'
GO
ALTER TABLE [dbo].[TR_DOC]  WITH NOCHECK ADD  CONSTRAINT [FK_TR_DOC] FOREIGN KEY([DOC_ID])
REFERENCES [dbo].[C_OBJ_ID] ([ID])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[TR_DOC] CHECK CONSTRAINT [FK_TR_DOC]
GO
ALTER TABLE [dbo].[TR_DOC]  WITH NOCHECK ADD  CONSTRAINT [FK_TR_DOC_C_DIC_ID] FOREIGN KEY([DIC_ID])
REFERENCES [dbo].[C_DIC_ID] ([DIC_ID])
GO
ALTER TABLE [dbo].[TR_DOC] CHECK CONSTRAINT [FK_TR_DOC_C_DIC_ID]
GO
ALTER TABLE [dbo].[TR_DOC]  WITH NOCHECK ADD  CONSTRAINT [FK_TR_DOC_C_PRS_ID] FOREIGN KEY([CR_PRS_ID])
REFERENCES [dbo].[C_PRS_ID] ([PRS_ID])
GO
ALTER TABLE [dbo].[TR_DOC] CHECK CONSTRAINT [FK_TR_DOC_C_PRS_ID]
GO
ALTER TABLE [dbo].[TR_DOC]  WITH NOCHECK ADD  CONSTRAINT [FK_TR_DOC_C_RAZ_ID1] FOREIGN KEY([RAZ_ID1])
REFERENCES [dbo].[C_RAZ_ID] ([RAZ_ID])
GO
ALTER TABLE [dbo].[TR_DOC] CHECK CONSTRAINT [FK_TR_DOC_C_RAZ_ID1]
GO
ALTER TABLE [dbo].[TR_DOC]  WITH NOCHECK ADD  CONSTRAINT [FK_TR_DOC_C_RAZ_ID2] FOREIGN KEY([RAZ_ID2])
REFERENCES [dbo].[C_RAZ_ID] ([RAZ_ID])
GO
ALTER TABLE [dbo].[TR_DOC] CHECK CONSTRAINT [FK_TR_DOC_C_RAZ_ID2]
GO
ALTER TABLE [dbo].[TR_DOC]  WITH NOCHECK ADD  CONSTRAINT [CK_TR_DOC_archive] CHECK  (([dic_id]=(123) OR [dic_id]<>(123) AND [DOC_DATE]<(40177)))
GO
ALTER TABLE [dbo].[TR_DOC] CHECK CONSTRAINT [CK_TR_DOC_archive]
11 янв 10, 10:10    [8163705]     Ответить | Цитировать Сообщить модератору
 Re: не сохраняется constraint expression  [new]
Glory
Member

Откуда:
Сообщений: 104760
Это тот скрипт, который вы выполняете для создания таблицы ?
11 янв 10, 10:12    [8163714]     Ответить | Цитировать Сообщить модератору
 Re: не сохраняется constraint expression  [new]
авторсообщения
Guest
таблица уже есть. в SMS делаю Check Constraint Expression, вбиваю в окошко условие, закрываю, сохраняю таблицу, заново смотрю Check Constraint Expression, вижу фигу.
Нет, в принципе у and приоритет вроде больше, чем or. Но кто его просит мои скобки убирать?
11 янв 10, 10:20    [8163746]     Ответить | Цитировать Сообщить модератору
 Re: не сохраняется constraint expression  [new]
Glory
Member

Откуда:
Сообщений: 104760
авторсообщения
таблица уже есть. в SMS делаю Check Constraint Expression, вбиваю в окошко условие, закрываю, сохраняю таблицу, заново смотрю Check Constraint Expression, вижу фигу.
Нет, в принципе у and приоритет вроде больше, чем or. Но кто его просит мои скобки убирать?

Ну так вы покажите скрипт, которым вы пытаетесь создать/изменить это Check Constraint Expression ?
11 янв 10, 10:24    [8163771]     Ответить | Цитировать Сообщить модератору
 Re: не сохраняется constraint expression  [new]
авторсообщения
Guest
Glory,
Вы знаете про кнопку Modify в SMS? Про диалог Check Constraints, который вызывается? Про редактор Expression в это диалоге?
11 янв 10, 10:29    [8163803]     Ответить | Цитировать Сообщить модератору
 Re: не сохраняется constraint expression  [new]
Glory
Member

Откуда:
Сообщений: 104760
авторсообщения
Glory,
Вы знаете про кнопку Modify в SMS? Про диалог Check Constraints, который вызывается? Про редактор Expression в это диалоге?

Т.е. мне нужно подъехать к вам и на вашей машине нажать кнопку Modify в SMS?
11 янв 10, 10:31    [8163813]     Ответить | Цитировать Сообщить модератору
 Re: не сохраняется constraint expression  [new]
авторсообщения
Guest
Glory,
см. мой вопрос. что еще вам нужно для ответа?
11 янв 10, 10:33    [8163824]     Ответить | Цитировать Сообщить модератору
 Re: не сохраняется constraint expression  [new]
Glory
Member

Откуда:
Сообщений: 104760
авторсообщения
Glory,
см. мой вопрос. что еще вам нужно для ответа?

Нужен скрипт, которым вы пытаетесь создать/изменить этот Check Constraint Expression
11 янв 10, 10:35    [8163829]     Ответить | Цитировать Сообщить модератору
 Re: не сохраняется constraint expression  [new]
авторсообщения
Guest
Glory
Нужен скрипт, которым вы пытаетесь создать/изменить этот Check Constraint Expression

авторсообщения

таблица уже есть. в SMS делаю Check Constraint Expression, вбиваю в окошко условие, закрываю, сохраняю таблицу, заново смотрю Check Constraint Expression, вижу фигу.


если мой вопрос неясен, пожалуйста, сделаю именно скрипт, например:
ALTER TABLE [dbo].[TR_DOC] DROP CONSTRAINT [CK_TR_DOC_archive]
go
ALTER TABLE [dbo].[TR_DOC]  WITH NOCHECK ADD  CONSTRAINT [CK_TR_DOC_archive] CHECK  ((dic_id=123) OR (dic_id<>123 AND DOC_DATE<40177))
go
ALTER TABLE [dbo].[TR_DOC] CHECK CONSTRAINT [CK_TR_DOC_archive]
11 янв 10, 10:41    [8163859]     Ответить | Цитировать Сообщить модератору
 Re: не сохраняется constraint expression  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31161
x644444
sql2005x64.
на таблицу пишу constraint
(dic_id<>123 AND DOC_DATE<40177) OR (dic_id=123)
суть: на все dic_id (кроме 123) ограничить doc_date
сохраняю.открываю.вижу ерунду
([dic_id]<>(123) AND [DOC_DATE]<(40177) OR [dic_id]=(123))

менял местами условия - пофиг, логические скобки игнорируются, лог операторы ставятся последовательно. что скажете?
Да, скобки меняет :-)

Хотя по моему логика не меняется.

И ещё, вашу логику (на все dic_id (кроме 123) ограничить doc_date) лучьше (и понятнее) переписать так:
DOC_DATE<40177 OR dic_id=123
11 янв 10, 11:02    [8164005]     Ответить | Цитировать Сообщить модератору
 Re: не сохраняется constraint expression  [new]
Glory
Member

Откуда:
Сообщений: 104760
alexeyvg


Хотя по моему логика не меняется.

И ещё, вашу логику (на все dic_id (кроме 123) ограничить doc_date) лучьше (и понятнее) переписать так:
DOC_DATE<40177 OR dic_id=123

+1
Это легко проверить 3мя insert-ми
11 янв 10, 11:10    [8164054]     Ответить | Цитировать Сообщить модератору
 Re: не сохраняется constraint expression  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
alexeyvg
И ещё, вашу логику (на все dic_id (кроме 123) ограничить doc_date) лучьше (и понятнее) переписать так:
DOC_DATE<40177 OR dic_id=123
+100
x644444,
почему Вас так волнует, в каком виде сервер хранит у себя текст констрейнта?
И почему так неряшлево оформлен скрипт - где-то имя поля написано строчными буквами,
а где-то - прописными?
Если Вам всё равно, то мне, например, чтобы повторить у себя выполнение Вашего скрипта,
приходится его долго "причёсывать".
IMHO, правильнее всегда считать, что имена объектов чувствительны к регистру.
11 янв 10, 11:17    [8164116]     Ответить | Цитировать Сообщить модератору
 Re: не сохраняется constraint expression  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
авторсообщения,

кстати, Вы не сталкивались с тем, что сервер сохраняет в констрейнте операторы AND, >= и <= вместо BETWEEN
и операторы OR и = вместо IN?
11 янв 10, 11:21    [8164143]     Ответить | Цитировать Сообщить модератору
 Re: не сохраняется constraint expression  [new]
авторсообщения
Guest
alexeyvg
Да, скобки меняет :-)
Хотя по моему логика не меняется.
И ещё, вашу логику (на все dic_id (кроме 123) ограничить doc_date) лучьше (и понятнее) переписать так:
DOC_DATE<40177 OR dic_id=123

алексей, в итоге так и переписал. но возмущение в душе осталось:)
вижу два варианта.
первый. глючит диалог (как например в Access со сложными подзапросам).это плохо.
второй. диалог умный и оптимизирует, сохраняя логический результат. это хорошо. но не верю:)
11 янв 10, 11:24    [8164172]     Ответить | Цитировать Сообщить модератору
 Re: не сохраняется constraint expression  [new]
Glory
Member

Откуда:
Сообщений: 104760
авторсообщения

второй. диалог умный и оптимизирует, сохраняя логический результат. это хорошо. но не верю:)

Диалог тут непричем. Это тоже легко проверить, выполняя непосредственно скрипт. (Для чего его кстати и просили)
11 янв 10, 11:27    [8164188]     Ответить | Цитировать Сообщить модератору
 Re: не сохраняется constraint expression  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31161
Glory
авторсообщения

второй. диалог умный и оптимизирует, сохраняя логический результат. это хорошо. но не верю:)

Диалог тут непричем. Это тоже легко проверить, выполняя непосредственно скрипт. (Для чего его кстати и просили)
Ну да.

Лучьше вопросы оформлять так:

create table [dbo].[TR_DOC] 
(
dic_id int, DOC_DATE int
)
go
--ALTER TABLE [dbo].[TR_DOC] DROP CONSTRAINT [CK_TR_DOC_archive]
go
ALTER TABLE [dbo].[TR_DOC]  WITH NOCHECK ADD  CONSTRAINT [CK_TR_DOC_archive] 
CHECK   (([dic_id]<>123 AND [DOC_DATE]<40177) or [dic_id]=123)
go
ALTER TABLE [dbo].[TR_DOC] CHECK CONSTRAINT [CK_TR_DOC_archive]
exec sp_helptext 'CK_TR_DOC_archive'
go
drop table [dbo].[TR_DOC] 
Сервер сам раскрывает и преобразовывает выражнения в CHECK - констрейнах.
Может, это и плохо (неудобно в чём-то), но не баг.
11 янв 10, 11:32    [8164240]     Ответить | Цитировать Сообщить модератору
 Re: не сохраняется constraint expression  [new]
авторсообщения
Guest
недостатки учел. ответ получил. всем спасибо!
11 янв 10, 11:34    [8164260]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить