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

Откуда:
Сообщений: 8
Помогите люди добрые)
Есть таблица, в которую надо вносить в 2 столбца значения. Есть другая, в которой 2 столбца с комбинациями, которые разрешено вносить в первую.
Соответственно, надо как-то на первую таблицу наложить ограничение, чтоб была проверка - если такая комбинация есть во второй таблице, значит можно вносить в первую.
Не могу придумать как бы это реализовать.

Заранее спасибо
5 фев 16, 16:47    [18778722]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение на столбец по значениям в другой таблице  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
ka4agar,

напишите скалярную функцию, которая будет проверять условия по второй таблице, функцию добавьте в ограничения первой таблицы.
5 фев 16, 16:52    [18778741]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение на столбец по значениям в другой таблице  [new]
ka4agar
Member

Откуда:
Сообщений: 8
Ну например функция blabla получает значение @asd, которое надо внести. Проверяет это значение во второй таблице, и если оно там есть возвращает к примеру (1).

Далее констрейнт, if blabla(@asd) = 1?
B как в этот вызов функции передать этот параметр?
Например будет insert into t1(s1,s2) values 1,2
И функция ничего не получит.
У меня поплава уже по этому поводу)
5 фев 16, 16:59    [18778768]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение на столбец по значениям в другой таблице  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ka4agar
Далее констрейнт, if blabla(@asd) = 1?

а констрейнт тут при чем ?
5 фев 16, 17:02    [18778788]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение на столбец по значениям в другой таблице  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
1. сделайте хранимую процедуру и вызывайте
2. сделайте интед оф триггер
5 фев 16, 17:03    [18778791]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение на столбец по значениям в другой таблице  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
ka4agar,

computed column + foreign key, msdn
5 фев 16, 17:11    [18778826]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение на столбец по значениям в другой таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
ka4agar
Соответственно, надо как-то на первую таблицу наложить ограничение, чтоб была проверка - если такая комбинация есть во второй таблице, значит можно вносить в первую.
Не могу придумать как бы это реализовать.
Банальный FK
use tempdb;
go

create table dbo.t1 (f1 int, f2 int, unique (f1, f2));
create table dbo.t2 (id int primary key, f1 int, f2 int, foreign key (f1, f2) references dbo.t1 (f1, f2));
go

insert into dbo.t1 values (1, 1);
go

insert into dbo.t2 values (1, 1, 1);
go

insert into dbo.t2 values (2, 2, 1);
go

select * from dbo.t2;
go

drop table dbo.t2, dbo.t1;
go
5 фев 16, 17:29    [18778902]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение на столбец по значениям в другой таблице  [new]
ka4agar
Member

Откуда:
Сообщений: 8
Maxx
1. сделайте хранимую процедуру и вызывайте
2. сделайте интед оф триггер


Через триггер получилось, спасибо, но выглядит это странновато)


IF OBJECT_ID ('trig','TR') IS NOT NULL
    DROP TRIGGER trig

GO

CREATE TRIGGER trig ON [dbo].[t1]
INSTEAD OF INSERT
AS
BEGIN	
	SET NOCOUNT ON;
	DECLARE @val int
	SELECT @val =  v1 FROM inserted
	IF [dbo].[asdfg](@val)=1
		INSERT INTO t1
		SELECT v1, v2
		FROM inserted
	ELSE
	ROLLBACK


Процедура проверяет только по первому полю.
5 фев 16, 17:38    [18778948]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение на столбец по значениям в другой таблице  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
SELECT @val =  v1 FROM inserted


там же может быть несколько строк, у вас триггер ошибку даст
5 фев 16, 17:41    [18778965]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение на столбец по значениям в другой таблице  [new]
ka4agar
Member

Откуда:
Сообщений: 8
Konst_One
SELECT @val =  v1 FROM inserted


там же может быть несколько строк, у вас триггер ошибку даст


Действительно, об этом не подумал...
Тогда как посоветуете это провернуть?
5 фев 16, 17:48    [18778997]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение на столбец по значениям в другой таблице  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
[dbo].[asdfg] - это у вас функция? добавьте условие в where своего insert
5 фев 16, 17:52    [18779011]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение на столбец по значениям в другой таблице  [new]
ka4agar
Member

Откуда:
Сообщений: 8
invm
ka4agar
Соответственно, надо как-то на первую таблицу наложить ограничение, чтоб была проверка - если такая комбинация есть во второй таблице, значит можно вносить в первую.
Не могу придумать как бы это реализовать.
Банальный FK
use tempdb;
go

create table dbo.t1 (f1 int, f2 int, unique (f1, f2));
create table dbo.t2 (id int primary key, f1 int, f2 int, foreign key (f1, f2) references dbo.t1 (f1, f2));
go

insert into dbo.t1 values (1, 1);
go

insert into dbo.t2 values (1, 1, 1);
go

insert into dbo.t2 values (2, 2, 1);
go

select * from dbo.t2;
go

drop table dbo.t2, dbo.t1;
go


В таблице t1 - f1 и f2 не уникальны. Тогда FK не может на них ссылаться. Их комбинация - да, уникальна.
5 фев 16, 18:03    [18779052]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение на столбец по значениям в другой таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
ka4agar
Их комбинация - да, уникальна.
Читаем текст примера внимательно:
create table dbo.t1 (f1 int, f2 int, unique (f1, f2));
5 фев 16, 18:16    [18779118]     Ответить | Цитировать Сообщить модератору
 Re: Ограничение на столбец по значениям в другой таблице  [new]
ka4agar
Member

Откуда:
Сообщений: 8
invm
ka4agar
Их комбинация - да, уникальна.
Читаем текст примера внимательно


Да, прошу прощения.
Наверное самый простой и прямой вариант) Спасибо
5 фев 16, 18:30    [18779193]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить