Здравтсвуйте! Помогите решить проблему с триггерами в MS SQL 2000.
Есть 3 таблицы Filial (Id - автоинкрементное, Name), Race (Id - автоинкрементное, Name) и
Fil_Race (Id - автоинкрементное, Fil_Id, Race_Id, Name, Avail). Таблицы
Filial и Fil_Race имеют общее поле для связи (Filial.Id=Fil_Race.Fil_Id), а таблицы
Race и Race имеют общее поле для связи (Race.Id=Fil_Race.Race_Id). Необходимо
создать следующий триггер на вставку новой записи в таблицу Filial.
Id всех записей таблицы Race вставить в Fil_Race со зачением нового id
таблицы Filial.
Конкретно не могу решить вопрос по получению id новой
вставленной записи в Filial и вставке значений из поля всех
записей таблицы Race.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
12-05-2005 08:59 | Сообщение от автора вопроса
Большое спасибо. Действительно работает. Я-то думал, что
поле Id у меня автоинрементное. А щас глянул-точно, забыл сделать автоинкрементным.
Еще раз спасибо
ошибка "Cannot insert the value NULL into column 'Id',
table dbo.Fil_Race; column does not allow nulls. Insert fails".
Это значит, что у тебя поле Id в табл.Fil_Race имеет ограничение NOT NULL. Тебе или нужно снять это ограничение, и тогда ты должен будешь заполнять это поле при вставке сам, или же ты сделай это поле счетчиком, и тогда оно будет наращиваться на единицу автоматически и его не надо указывать в insert.
И еще. Добавь в начале триггера эти строчки:
if @@rowcount = 0
begin
return
end
Это защита от ложного срабатывания триггера, так всегда делается.
Спасибо! Помогло. Но у меня добавилось условие. Если в
Fil_Race уже есть записи с добавляемым @fid, то тогда
добавлять не нужно в Fil_Race. Я пишу:
CREATE TRIGGER Filials_Insert ON [dbo].[Filials]
AFTER INSERT
AS
declare @fid int
select @fid = inserted.Id from inserted
if not exists (select * from Fil_Race where Fil_Race.Filial_Id=@fid)
begin
insert into Fil_Race (Filial_Id, Race_Id, BeginD, EndD) select @fid, Race.Id,
Race.BeginDate, Race.EndDate from Race
end
Действительно, если в табл. Filial добавляется запись с
уже имеющемся в ней id (это поле не является ключом), то
ничего не происходит. А если добавляется запись с новым
id то происх. ошибка "Cannot insert the value NULL into column 'Id',
table dbo.Fil_Race; column does not allow nulls. Insert fails".
Не знаю почему может что-то не так написал?
Например табл. Filial:
Id Name
1 aaa
1 aaa_aaa
2 bbb
2 bbb_bbb
.........................
Если сейчас добавить запись с Id=2 то триггер не сработает,
а если с другим Id то возникнет эта ошибка.
Спасибо за ответ на 1 вопрос
Объясняю! Нужно взять взять все id всех записей из Race и вставить
их новые записи в таблицу Fil_Race (в поле Race_Id)
Fil_Id это будет @fid (id добавленной записи в Filial)
Т. е. есть табл. RAce:
id Name
1 AAA
2 BBB
3 CCC
... ...
Нужно добавить все эти записи в Fil_Race, чтобы появились такие записи:
... ....
Id Fil_Id Race_Id
... @fid 1
... @fid 2
... @fid 3
... @fid ...
Конкретно не могу решить вопрос по получению id новой
вставленной записи в Filial
declare @fid int
select @fid = inserted.Fil_Id
from inserted
и вставке значений из поля всех
записей таблицы Race
Tут не совсем ясно, что тебе нужно. Tо ли выбрать все записи из Race, где Race.Id=@fid и вставить их в Filial. Tо ли выбрать вообще все записи из Race, проапдейтить Id на новое и затем вставить в Fil_Race.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.