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

Откуда:
Сообщений: 98
Доброе время суток всем.
Есть 2 таблицы
 CREATE TABLE [dbo].[spr_Uch](
	[Link] [int] IDENTITY(1,1) NOT NULL,
 CONSTRAINT [PK_spr_Uch] PRIMARY KEY CLUSTERED 
(
	[Link] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

CREATE TABLE [dbo].[spr_Oborudov](
	[Link] [int] IDENTITY(1,1) NOT NULL,
	[ID_Uch] [int] NULL,
 CONSTRAINT [PK_spr_Oborudov] PRIMARY KEY CLUSTERED 
(
	[Link] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
ALTER TABLE [dbo].[spr_Oborudov]  WITH CHECK ADD  CONSTRAINT [FK_spr_Oborudov_spr_Uch] FOREIGN KEY([ID_Uch])
REFERENCES [dbo].[spr_Uch] ([Link])


Есть триггер, который должен при удалении записи в таблице spr_Uch в поле ID_Uch таблицы spr_Oborudov проставить значение NULL (взятый с сайта [url=]http://support.microsoft.com/kb/142480[/url])
CREATE TRIGGER [dbo].[trDelUch] 
   ON  [dbo].[spr_Uch]  
   FOR DELETE
AS 
BEGIN
    UPDATE spr_Oborudov
      SET spr_Oborudov.ID_Uch = NULL
    FROM spr_Oborudov, deleted
    WHERE spr_Oborudov.ID_Uch = deleted.Link	

END

Однако, при удалении записи из таблицы spr_Uch, выдается следующая ошибка
The DELETE statement conflicted with the REFERENCE constraint "FK_spr_Oborudov_spr_Uch". The conflict occurred in database "Fox", table "dbo.spr_Oborudov", column 'ID_Uch'.
Хотя, согласно инфы с сайта, все должно быть хорошо. Куда копать, и где ошибка?
11 окт 12, 11:28    [13301149]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на изменение  [new]
NightSkif
Member

Откуда:
Сообщений: 98
Забыл добавить,
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (Intel X86) Apr 22 2011 11:57:00 Copyright (c) Microsoft Corporation Express Edition with Advanced Services on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)
11 окт 12, 11:30    [13301160]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на изменение  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Вот это вот:
автор
ALTER TABLE [dbo].[spr_Oborudov] WITH CHECK ADD CONSTRAINT [FK_spr_Oborudov_spr_Uch] FOREIGN KEY([ID_Uch])
REFERENCES [dbo].[spr_Uch] ([Link])


замените на

ALTER TABLE [dbo].[spr_Oborudov]  WITH CHECK ADD  CONSTRAINT [FK_spr_Oborudov_spr_Uch] FOREIGN KEY([ID_Uch])
REFERENCES [dbo].[spr_Uch] ([Link]) ON DELETE SET NULL


и не надо никакого триггера.
11 окт 12, 11:31    [13301164]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на изменение  [new]
Glory
Member

Откуда:
Сообщений: 104751
NightSkif
Хотя, согласно инфы с сайта, все должно быть хорошо.

И что там на сайте написано, что сначала именно должен сработать триггер, а потом только проверяться FK constraint ?
11 окт 12, 11:31    [13301167]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на изменение  [new]
Ozerov
Member

Откуда: Москва
Сообщений: 3637
Сначала удалять запись из dbo.spr_Oborudov ?
11 окт 12, 11:31    [13301173]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на изменение  [new]
NightSkif
Member

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

Нет, запись удаляется из spr_Uch
11 окт 12, 11:50    [13301300]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на изменение  [new]
NightSkif
Member

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

Ниже приведен пример SetNull удалить триггер в таблице titleauthor, который обновляет все строки в таблице titleauthor совпадающие значения внешнего ключа. Еще раз поскольку title_id PrimaryKey titleauthor этот триггер предполагается, что без последующих уровней таблиц с ForeignKeys, ссылаясь на titleauthor. Это будет работать правильно даже для удаления нескольких строк.
CREATE TRIGGER DelSetNullTrig
  ON titles
  FOR DELETE
AS
    UPDATE titleauthor
      SET titleauthor.title_id = NULL
        FROM titleauthor, deleted
        WHERE titleauthor.title_id = deleted.title_id
11 окт 12, 11:51    [13301309]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на изменение  [new]
Glory
Member

Откуда:
Сообщений: 104751
NightSkif
Ниже приведен пример SetNull удалить триггер в таблице titleauthor, который обновляет все строки в таблице titleauthor совпадающие значения внешнего ключа. Еще раз поскольку title_id PrimaryKey titleauthor этот триггер предполагается, что без последующих уровней таблиц с ForeignKeys, ссылаясь на titleauthor. Это будет работать правильно даже для удаления нескольких строк.

И где тут сказано то, что сначала будет работать триггер, а только потом проверяться FK constraint ?
11 окт 12, 11:59    [13301374]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на изменение  [new]
NightSkif
Member

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

Тогда, как должен выглядеть тригер, чтобы при удалении записи из spr_Uch в связнных полях в таблице spr_Oborudov стало значение NULL?
11 окт 12, 12:13    [13301464]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на изменение  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
NightSkif
Glory,

Тогда, как должен выглядеть тригер, чтобы при удалении записи из spr_Uch в связнных полях в таблице spr_Oborudov стало значение NULL?
Триггер не нужен. Ведь сказал же уже pkarklin
11 окт 12, 12:15    [13301484]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на изменение  [new]
Glory
Member

Откуда:
Сообщений: 104751
NightSkif
Тогда, как должен выглядеть тригер, чтобы при удалении записи из spr_Uch в связнных полях в таблице spr_Oborudov стало значение NULL?

Причем тут триггер ?
Вы сообщение об ошибке прочитали ?
Вы понимаете, что сначала проверяется FK constraint, а только потом будет работать триггер ?
11 окт 12, 12:16    [13301489]     Ответить | Цитировать Сообщить модератору
 Re: Тригер на изменение  [new]
NightSkif
Member

Откуда:
Сообщений: 98
Спасибо всем, что на путь истинный направили
11 окт 12, 12:42    [13301717]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить