powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Ссылочная целостность триггерами
15 сообщений из 15, страница 1 из 1
Ссылочная целостность триггерами
    #37512264
Kyubee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то давным давно читал, что сабж - плохо, и всячески избегал так делать. Но если всё-таки нужно, например надо сделать "foreign key" на 2 и более таблиц - какие могут быть подводные грабли?
...
Рейтинг: 0 / 0
Ссылочная целостность триггерами
    #37512277
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kyubeeкакие могут быть подводные грабли?
Ничего особенного: просто будут появляться записи, эту самую целостность нарушающие.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Ссылочная целостность триггерами
    #37512304
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kyubee например надо сделать "foreign key" на 2 и более таблицЭто как? Значение в поле может быть только из этой или той таблицы, ну или вон той, так? В таком случае добавляют несколько полей каждая со своим ограничением внешнего ключа и ограничение на строку что только одно из полей должно содержать непустое значение.

Триггеры, в отличие от ограничения внешнего ключа, не проверяют все имеющиеся записи, то есть включение триггера не гарантирует, что все записи прошли проверку. Вообще, использование триггеров в приложении, это как повесить провод "соплей" - быстро, дешево и сердито, но неаккуратненько как-то (с). Ну и плюс производительность обычно страдает.
...
Рейтинг: 0 / 0
Ссылочная целостность триггерами
    #37512317
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KyubeeЧто-то давным давно читал, что сабж - плохо, и всячески избегал так делать. Но если всё-таки нужно, например надо сделать "foreign key" на 2 и более таблиц - какие могут быть подводные грабли? Триггер сложнее, соответствено, больше вероятность ошибок. А для контроля целостности чем надёжнее, тем лучьше.

Ну и чем сложнее логика, тем больше просадка производительности (хотя это может быть неважно).

А так, в принципе, просто разная физическая реализация одного и того-же.

KyubeeНо если всё-таки нужно, например надо сделать "foreign key" на 2 и более таблицМожно и обычными FK сделать.
...
Рейтинг: 0 / 0
Ссылочная целостность триггерами
    #37512503
Kyubee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SERG1257>несколько полей каждая со своим ограничением внешнего ключа
1) так уже делается, полей плодится всё больше, управляться с ними всё сложнее
2) таблица может быть из другой базы
Речь про mssql, триггера можно делать не на скрипте а на c# и соответственно ни в чём себе не отказывать насчёт сложности логики.

alexeyvg>просто разная физическая реализация
Описано ли где-нибудь как это реализовано внутри у sql-серверов? Какие-нибудь невидимые системные триггеры?

Dimitry Sibiryakov>Ничего особенного: просто будут появляться записи, эту самую целостность нарушающие.
Если просто - значит можно это как-то смоделировать?
Смутно помню, была статья с примером как 2 конкурирующие транзакции в случае с триггерами приводили к ошибке.
...
Рейтинг: 0 / 0
Ссылочная целостность триггерами
    #37512526
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KyubeeЕсли просто - значит можно это как-то смоделировать?
Стартовать транзакцию, удалить запись в главной таблице, не коммитить.
Стартовать вторую транзакцию, добавить запись в подчинённую со ссылкой на эту запись,
закоммитить.
Закоммитить первую транзакцию.
Всё, телемаркет - дочерняя запись ссылается в ничто.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Ссылочная целостность триггерами
    #37512601
Kyubee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovСтартовать транзакцию, удалить запись в главной таблице, не коммитить.
Стартовать вторую транзакцию, добавить запись в подчинённую со ссылкой на эту запись,

после этого 2я встаёт на блокировку, её не закоммитить пока не завершится 1я
...
Рейтинг: 0 / 0
Ссылочная целостность триггерами
    #37512635
Dimitry SibiryakovKyubeeкакие могут быть подводные грабли?
Ничего особенного: просто будут появляться записи, эту самую целостность нарушающие.

подобные грабли возникают только если вы их специально реализовываете. осознанно или нет.
...
Рейтинг: 0 / 0
Ссылочная целостность триггерами
    #37512649
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kyubeeпосле этого 2я встаёт на блокировку, её не закоммитить пока не завершится 1я

С чего бы это вдруг? Во-первых, FK нет, с точки зрения сервера эти таблицы никак не
связаны. А во-вторых, MS SQL перестал быть блокировочником ещё пять лет назад, теперь
читатели не тормозят на писателях
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Ссылочная целостность триггерами
    #37512678
Kyubee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Провёл эксперимент.
База:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
create database test3
go
use test3
create table tree (id int not null primary key, ParentID int, TargetID int)
create table cat1 (id int not null primary key, name varchar(max))
create table cat2 (id int not null primary key, name varchar(max))
go
create trigger fk_target_ins on tree instead of insert
as
	declare @insID int
	select @insID=TargetID from inserted
	if(not exists(select * from cat1 where id=@insID)
		and not exists(select * from cat2 where id=@insID))
		raiserror  50001  'cant Ins tree'
	else insert tree select * from inserted
go
create trigger fk_target_upd on tree instead of update
as
	declare @insID int
	declare @ParentID int
	declare @TargetID int
	select @insID=TargetID, @ParentID=ParentID, @TargetID=TargetID from inserted
	if(not exists(select * from cat1 where id=@insID)
		and not exists(select * from cat2 where id=@insID))
		raiserror  50001  'cant Upd tree'
	else update tree set
			ParentID=@ParentID,
			TargetID=@TargetID
		where id=@insID
go
INSERT [dbo].[cat2] ([id], [name]) VALUES ( 10 , N'qwe')
INSERT [dbo].[cat2] ([id], [name]) VALUES ( 20 , N'asd')
INSERT [dbo].[cat1] ([id], [name]) VALUES ( 100 , N'zxc')
INSERT [dbo].[cat1] ([id], [name]) VALUES ( 110 , N'vbn')
INSERT [dbo].[tree] ([id], [ParentID], [TargetID]) VALUES ( 1 , NULL,  10 )
INSERT [dbo].[tree] ([id], [ParentID], [TargetID]) VALUES ( 2 , NULL,  20 )
INSERT [dbo].[tree] ([id], [ParentID], [TargetID]) VALUES ( 3 , NULL,  100 )
INSERT [dbo].[tree] ([id], [ParentID], [TargetID]) VALUES ( 4 , NULL,  110 )


Запросы, гоняем по одной строчке в разных коннектах:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
begin tran
delete cat1 where id= 110 
commit tran

begin tran
insert tree (id, TargetID) values ( 5 ,  110 )
commit tran
...
Рейтинг: 0 / 0
Ссылочная целостность триггерами
    #37512746
Dimitry SibiryakovKyubeeпосле этого 2я встаёт на блокировку, её не закоммитить пока не завершится 1я

С чего бы это вдруг? Во-первых, FK нет, с точки зрения сервера эти таблицы никак не
связаны. А во-вторых, MS SQL перестал быть блокировочником ещё пять лет назад, теперь
читатели не тормозят на писателях

хелп про уровни изоляции почитайте для общего развития.
...
Рейтинг: 0 / 0
Ссылочная целостность триггерами
    #37512754
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kyubeealexeyvg>просто разная физическая реализация
Описано ли где-нибудь как это реализовано внутри у sql-серверов? Какие-нибудь невидимые системные триггеры?Ну разумеется. Любой констрейн реализуется неким скрытым системным триггером на какие то события, как же ещё?


Dimitry SibiryakovKyubeeЕсли просто - значит можно это как-то смоделировать?
Стартовать транзакцию, удалить запись в главной таблице, не коммитить.
Стартовать вторую транзакцию, добавить запись в подчинённую со ссылкой на эту запись,
закоммитить.
Закоммитить первую транзакцию.
Всё, телемаркет - дочерняя запись ссылается в ничто. Нужно просто правильно писать.

Согласитесь, тот код, который реализует нативные ФК в СУБД, не допускает такого? А ведь писали его такие же люди, аткими же руками :-)
...
Рейтинг: 0 / 0
Ссылочная целостность триггерами
    #37512789
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgСогласитесь, тот код, который реализует нативные ФК в СУБД, не допускает такого? А ведь
писали его такие же люди, аткими же руками :-)

Да, но этот код имеет доступ к таким вещам как Dirty Read. У пользовательских триггеров
его нет, так что триггер, сработавший в транзакции с TIL snapshot будет отлично видеть
родительскую запись такой, какой она была на момент старта транзакции. То бишь - неудалённой.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Ссылочная целостность триггерами
    #37513048
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovДа, но этот код имеет доступ к таким вещам как Dirty Read.В смысле, код, реализующий FK, использует грязное чтение при проверке ограничений? Что то я сомневаюсь.


Dimitry SibiryakovУ пользовательских триггеров
его нет, так что триггер, сработавший в транзакции с TIL snapshot будет отлично видеть
родительскую запись такой, какой она была на момент старта транзакции. То бишь - неудалённой.Так надо при написании триггера использовать нужные блокировки. По моему, для этого нет никаких препятствий.
...
Рейтинг: 0 / 0
Ссылочная целостность триггерами
    #37513053
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgВ смысле, код, реализующий FK, использует грязное чтение при проверке
ограничений? Что то я сомневаюсь.
Сомневаться - почётная обязанность каждого мыслящего человека.

alexeyvgнадо при написании триггера использовать нужные блокировки.

Да? И какие блокировки тут нужны? Эксклюзив на всю мастер-таблицу при добавлении детали?
Или эксклюзив на всю деталь при удалении мастера?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Ссылочная целостность триггерами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]