Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 [t-sql] trigger for insert, работа с вирт табл inserted. нужно сделать проверку на дубли  [new]
MrSmith001
Member

Откуда:
Сообщений: 4
то-есть, если 3 табл - Table1(doc_id,..), Table2(id, doc_id, subdoc_id), Table3(subdoc_id,..).
для документа doc_id добавляется новый (связанный с ним) документ subdoc_id. нужно проверять при добавлении в Table3 есть ли уже по doc_id (доку по которому мы добавляем под-документ subdoc_id) связанные документы. если есть не добавляем.

как правильно организовать эту проверку, или проще как-то по другому?

всем спасибо
22 июн 11, 10:30    [10852030]     Ответить | Цитировать Сообщить модератору
 Re: [t-sql] trigger for insert, работа с вирт табл inserted. нужно сделать проверку на дубли  [new]
Хмммммммм
Guest
MrSmith001,

А куда добавляем, в T2 ?
22 июн 11, 10:42    [10852122]     Ответить | Цитировать Сообщить модератору
 Re: [t-sql] trigger for insert, работа с вирт табл inserted. нужно сделать проверку на дубли  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
MrSmith001,

во-первых сообщить базе о том что дублей быть не должно посредством создания уникального констрейнта/индекса. во-вторых, при вставке проверять налчие при помощи конструкции where not exists(...).
22 июн 11, 10:43    [10852130]     Ответить | Цитировать Сообщить модератору
 Re: [t-sql] trigger for insert, работа с вирт табл inserted. нужно сделать проверку на дубли  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
SomewhereSomehow
...посредством создания уникального констрейнта/индекса. во-вторых, при вставке проверять налчие при помощи конструкции where not exists(...).
Или с IGNORE_DUP_KEY = ON
22 июн 11, 10:57    [10852227]     Ответить | Цитировать Сообщить модератору
 Re: [t-sql] trigger for insert, работа с вирт табл inserted. нужно сделать проверку на дубли  [new]
MrSmith001
Member

Откуда:
Сообщений: 4
Хмммммммм
MrSmith001,

А куда добавляем, в T2 ?


добавляю в T3
22 июн 11, 11:10    [10852338]     Ответить | Цитировать Сообщить модератору
 Re: [t-sql] trigger for insert, работа с вирт табл inserted. нужно сделать проверку на дубли  [new]
MrSmith001
Member

Откуда:
Сообщений: 4
SomewhereSomehow
MrSmith001,

во-первых сообщить базе о том что дублей быть не должно посредством создания уникального констрейнта/индекса. во-вторых, при вставке проверять налчие при помощи конструкции where not exists(...).


саму конструкцию я знаю как проверять, у меня заминка в том, что нужно определить документ (Table1.doc_id) по которому добавляется запись в Table3.
то-есть я хочу по данным табл inserted (контрагент и сумма и подразделение) найти аналогичную запись в Table3. проверяю значения табл inserted в триггере, там все поля равны 0 кроме subdoc_id. по документации вродже не должны быть нулевыми.
в общем не могу врубится где меня заглючило
22 июн 11, 11:18    [10852396]     Ответить | Цитировать Сообщить модератору
 Re: [t-sql] trigger for insert, работа с вирт табл inserted. нужно сделать проверку на дубли  [new]
А может так
Guest
if object_id ('t2') is not null
	begin
		alter table t2
			drop constraint FK_T2_REFERENCE_T1
		alter table t2
			drop constraint FK_T2_REFERENCE_T3
		drop table t2
	end
	

go

if object_id ('t3') is not null
	drop table t3
go

if object_id ('t1') is not null
	drop table t1
go

create table t1 (doc_id int, constraint PK_T1 primary key (doc_id))
create table t3 (subdoc_id int, constraint PK_T3 primary key (subdoc_id))
create table t2 (id int identity (1,1), doc_id int, subdoc_id int,constraint PK_T2 primary key (subdoc_id))


alter table t2
   add constraint FK_T2_REFERENCE_T1 foreign key (doc_id)
      references t1 (doc_id)
go

alter table t2
   add constraint FK_T2_REFERENCE_T3 foreign key (subdoc_id)
      references t3 (subdoc_id)
go


insert into  t1 (doc_id ) values (1),(2),(3)

insert into t3 values (1),(2),(3),(4),(5),(6)


insert into t2 values (1,1),(1,2), (1,3)
go
insert into t2 values (2,4)
go
insert into t2 values (2,1)


select * from t2
22 июн 11, 11:25    [10852466]     Ответить | Цитировать Сообщить модератору
 Re: [t-sql] trigger for insert, работа с вирт табл inserted. нужно сделать проверку на дубли  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
MrSmith001
то-есть, если 3 табл - Table1(doc_id,..), Table2(id, doc_id, subdoc_id), Table3(subdoc_id,..).
для документа doc_id добавляется новый (связанный с ним) документ subdoc_id. нужно проверять при добавлении в Table3 есть ли уже по doc_id (доку по которому мы добавляем под-документ subdoc_id) связанные документы. если есть не добавляем.

как правильно организовать эту проверку, или проще как-то по другому?

всем спасибо

Обычно схема такая, две таблицы с разными сущностями. И например задача: необходимо обеспечить связь между этими двумя сущностями. При этом связь многие ко многим. Тогда делают промежуточную таблицу связей.

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

Но если вчитаться повнимательнее в ваш вопрос, то вроде как вы говорите о том, что запись вы вставляете в таблицу поддокументов, при этом уже что-то проверяете в таблице связей. Как так? Какие могут быть связи у строки, которая еще не добавлена? Или вы хотите проверить связи не конкретно для вставляемого поддокумента, а для вообще всех поддокументов которые есть у основного документа? В таком случае, это надо делать там, где есть данные, в какой документ будет добавлен вновь создаваемый поддокумент, а не в тригере на создание поддокумента. Или даже лучше сделать так, что раз у вас для одного основного документа может быть только один поддокумент - сделать в таблице основных документов поле, со ссылкой на поддокумент. Чтобы чисто архитектурно нельзя было создать для одного документа более чем один поддокумент.
22 июн 11, 11:42    [10852659]     Ответить | Цитировать Сообщить модератору
 Re: [t-sql] trigger for insert, работа с вирт табл inserted. нужно сделать проверку на дубли  [new]
MrSmith001
Member

Откуда:
Сообщений: 4
м-да, намудрил. это все магнитные бури))..
в общем все намного проще..
делаю проверку в Table2 на присутствие doc_id, потому как данные в Table3 все равно в транзакции попадают
22 июн 11, 17:47    [10856970]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить