Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Ограничения  [new]
InnerCloister
Member

Откуда: Ульяновск
Сообщений: 69
Нужно сделать ограничение на вводимое значение в поле таблицы. В выражении ограничения необходимо получить значение поля другой таблицы (таблицы связаны между собой, нужная запись в другой таблице может быть найдена по ключу данной таблицы). Как можно такое реализовать? Видел пример в MSDN:
+ Смотреть здесь
CREATE TABLE CheckTbl (col1 int, col2 int);
GO
CREATE FUNCTION CheckFnctn()
RETURNS int
AS 
BEGIN
   DECLARE @retval int
   SELECT @retval = COUNT(*) FROM CheckTbl
   RETURN @retval
END;
GO
ALTER TABLE CheckTbl
ADD CONSTRAINT chkRowCount CHECK (dbo.CheckFnctn() >= 1 );
GO

Тут на ходу создается функция с запросом, возвращающим значение. Такой способ подойдет для моей задачи. А можно ли как-то по-другому реализовать проверку? Чтобы не надо было создавать функцию. Мне нужно лишь получить значение поле из связанной таблицы.
20 сен 11, 14:37    [11305728]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
InnerCloister
А можно ли как-то по-другому реализовать проверку? Чтобы не надо было создавать функцию. Мне нужно лишь получить значение поле из связанной таблицы.
Или функцию создавать, или не использовать check constraint.
20 сен 11, 14:51    [11305879]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
Glory
Member

Откуда:
Сообщений: 104751
InnerCloister
Нужно сделать ограничение на вводимое значение в поле таблицы. В выражении ограничения необходимо получить значение поля другой таблицы (таблицы связаны между собой, нужная запись в другой таблице может быть найдена по ключу данной таблицы). Как можно такое реализовать?

Если таблицы уже "связаны между собой", то откуда тогда возникло еще одно такое же ограничение ?
20 сен 11, 14:53    [11305905]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
InnerCloister
Member

Откуда: Ульяновск
Сообщений: 69
Glory, почему такое же?
У меня в одной таблице хранится месяц и год, в другой - день. Но оба значения в виде даты. Я вот хочу, чтобы во второй таблице месяц и год были такими же, как в первой.
20 сен 11, 14:58    [11305954]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
InnerCloister
У меня в одной таблице хранится месяц и год, в другой - день.
Зачем?
20 сен 11, 15:01    [11305995]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
InnerCloister
Glory, почему такое же?
У меня в одной таблице хранится месяц и год, в другой - день. Но оба значения в виде даты. Я вот хочу, чтобы во второй таблице месяц и год были такими же, как в первой.
Чего-то криво всё как-то.
Либо делать скалярную функцию - и в констрейнт, либо триггер.
Но лучшее решение можно предложить,
только взглянув на структуры таблиц и данные.
20 сен 11, 15:03    [11306024]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
Glory
Member

Откуда:
Сообщений: 104751
InnerCloister
Glory, почему такое же?
У меня в одной таблице хранится месяц и год, в другой - день. Но оба значения в виде даты. Я вот хочу, чтобы во второй таблице месяц и год были такими же, как в первой.

И по какому же другому полю связаны таблицы, если согласно этому они должны быть связаны по полю даты ?
20 сен 11, 15:04    [11306029]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
InnerCloister
Member

Откуда: Ульяновск
Сообщений: 69
Mnior,

потому что есть данные которые связаны с месяцем, а есть данные, связанные с отдельным днем.
20 сен 11, 15:05    [11306037]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
InnerCloister
Member

Откуда: Ульяновск
Сообщений: 69
Glory,

по суррогатному ключу типа INT ^_^
20 сен 11, 15:06    [11306045]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
Glory
Member

Откуда:
Сообщений: 104751
InnerCloister
Glory,

по суррогатному ключу типа INT ^_^

Почему, если "Я вот хочу, чтобы во второй таблице месяц и год были такими же, как в первой" ?
20 сен 11, 15:10    [11306096]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
InnerCloister
Member

Откуда: Ульяновск
Сообщений: 69
Glory,

не люблю первичным ключом делать какие-то реальные данные. Да и если я сделаю первичным ключом дату, все равно понадобится какое-то еще поле в таблице, связанной с определенным днем. Ведь в ключевом поле день будет один и тот же для всех связанных таблиц.
20 сен 11, 15:13    [11306122]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
InnerCloister
Member

Откуда: Ульяновск
Сообщений: 69
вот если бы можно было сделать ключом отдельные компоненты даты, тогда бы и вопросов не было))
20 сен 11, 15:14    [11306142]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
Glory
Member

Откуда:
Сообщений: 104751
InnerCloister
не люблю первичным ключом делать какие-то реальные данные.

А причем тут ПК ? Мы говорим про поля, по которым будут связаны таблицы
20 сен 11, 15:20    [11306224]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
InnerCloister
потому что есть данные которые связаны с месяцем, а есть данные, связанные с отдельным днем.
И?
Есть две таблы свзанные по FK. Есть два временных поля, которые должны коллерировать (одно - без дня месяца).

Накуя - имеем только одно поле, месяц-год из которо можно выкусить свободно.
InnerCloister
есть другие "ограничения" завязанные на эти поля
Какие?
И если вы привели идиотский вариант как пример - совет, не приводите идиотских примеров. КО.
20 сен 11, 15:31    [11306337]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
InnerCloister
вот если бы можно было сделать ключом отдельные компоненты даты, тогда бы и вопросов не было
А разве нельзя?
20 сен 11, 15:32    [11306345]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
InnerCloister
Member

Откуда: Ульяновск
Сообщений: 69
Glory,

я как-то привык всегда делать связь по первичному ключу родительской таблицы. К тому же, месяц-год сам по себе потенциальным ключом не является, там для нескольких полей уникальность задана. Делать связь сразу из нескольких полей мне не очень хочется(
20 сен 11, 15:35    [11306365]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
InnerCloister
Member

Откуда: Ульяновск
Сообщений: 69
Mnior,

я думаю, что нельзя. Если вы не имеете ввиду создание отдельных полей для дня, месяца и года.
20 сен 11, 15:37    [11306384]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
Glory
Member

Откуда:
Сообщений: 104751
InnerCloister
я как-то привык всегда делать связь по первичному ключу родительской таблицы. К тому же, месяц-год сам по себе потенциальным ключом не является, там для нескольких полей уникальность задана. Делать связь сразу из нескольких полей мне не очень хочется(

Тогда вам наверное сначала лучше изучить теорию реляционных баз
И спроектировать нормальную схему
20 сен 11, 15:40    [11306411]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
InnerCloister
вот если бы можно было сделать ключом отдельные компоненты даты, тогда бы и вопросов не было))
USE tempdb
GO
CREATE TABLE dbo.Test (
	 [Date]		Date
	,YearMonth	AS (Year([Date])*100 + Month([Date]))
	PERSISTED
	CONSTRAINT [PK_Test] PRIMARY KEY
)
GO
INSERT dbo.Test VALUES ('20110819'),('20110920')
SELECT * FROM dbo.Test
INSERT dbo.Test VALUES ('20110921')
GO
DROP TABLE dbo.Test
[CSV ]2011-08-19 201108
2011-09-20 201109[/CSV]
(2 row(s) affected)
(2 row(s) affected)
Msg 2627, Level 14, State 1, Line 3
Нарушено "PK_Test" ограничения PRIMARY KEY. Не удается вставить повторяющийся ключ в объект "dbo.Test". Повторяющееся значение ключа: (201109).
Выполнение данной инструкции было прервано.
20 сен 11, 15:41    [11306427]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Mnior
Чёрт, предварительный просмотр не работает.
DateYearMonth
2011-08-19201108
2011-09-20201109
20 сен 11, 15:43    [11306442]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
InnerCloister, для примера:
use tempdb
go
create table dbo.Test
(
 dt date not null,
 dt_Year as datepart(year, dt) persisted,
 dt_Month as datepart(month, dt) persisted,
 dt_Day as datepart(day, dt) persisted,
 constraint PK_Test primary key (dt_Year, dt_Month, dt_Day)
);
20 сен 11, 15:46    [11306467]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Glory
Тогда вам наверное сначала лучше изучить теорию реляционных баз
И спроектировать нормальную схему
Плюсадын
20 сен 11, 15:47    [11306480]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
invm, dt_Day лишнее.
20 сен 11, 15:49    [11306499]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
InnerCloister
Member

Откуда: Ульяновск
Сообщений: 69
Glory,

учил я ее, учил. Целый отдельный предмет был. Опыта мало просто. Схему как раз и пытаюсь сделать. Я был бы рад обойтись без ограничений, чтобы все обеспечивалось только засчет связей, но не могу так придумать. Вот вариант схемы на данный момент.

К сообщению приложен файл. Размер - 39Kb
20 сен 11, 15:50    [11306516]     Ответить | Цитировать Сообщить модератору
 Re: Ограничения  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Btw, может, вам уже в форум Проектирование пора?

Сообщение было отредактировано: 20 сен 11, 15:52
20 сен 11, 15:52    [11306538]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить