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

Откуда:
Сообщений: 48
Создала триггер. Он не работает. (При попытке вставки в [dbo].[Order] выдается ошибка о том, что транзакция завершилась в триггере и выполение пакета прервано) В коде (см. ниже) подчеркивается имя триггера и высвечивается "Недопустимое имя объекта [dbo].[InsertOrder]"

USE [Selling]
GO
/****** Object: Trigger [dbo].[InsertOrder] Script Date: 26.05.2016 12:20:57 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/****** Object: Trigger [dbo].[InsertOrder] Script Date: 26.05.2016 11:47:58 ******/
ALTER TRIGGER [dbo].[InsertOrder] ON [dbo].[Order] AFTER INSERT
AS
BEGIN
DECLARE @idClient INT
DECLARE @idOrder INT
DECLARE @idSeller INT
DECLARE @dateAndTimeOfOrder datetimeoffset(7)
DECLARE @clientCity nchar(25)
DECLARE @sellerCity nchar(25)

SELECT @clientCity = (SELECT city FROM Client INNER JOIN inserted ON Client.id=inserted.idClient)
SELECT @sellerCity = (SELECT city FROM Seller INNER JOIN inserted ON Seller.id=inserted.idSeller)
IF(@clientCity = @sellerCity)
BEGIN
SELECT @idClient = (SELECT idClient FROM inserted)
SELECT @idOrder = (SELECT id FROM inserted)
SELECT @idSeller = (SELECT idSeller FROM inserted)
SELECT @dateAndTimeOfOrder = (SELECT dateAndTime FROM inserted)

INSERT INTO OrderHistory (idClient, idOrder, idSeller, type, dateAndTimeOfOrder, dateAndTimeOfOperation)
VALUES (@idClient, @idOrder, @idSeller, 'INSERT', @dateAndTimeOfOrder, SYSDATETIMEOFFSET())
END
ELSE
ROLLBACK TRANSACTION
END
26 май 16, 11:34    [19222102]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Teufel666,

так а триггер то создан? может CREATE TRIGGER
26 май 16, 11:37    [19222118]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
Teufel666
Member

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

Да он создан, и при создании никаких ошибок не выводилось.

К сообщению приложен файл. Размер - 1Kb
26 май 16, 11:40    [19222141]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Teufel666,
можно текст ошибки без вольного пересказа? :)
26 май 16, 11:42    [19222155]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
Teufel666
Member

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

К сообщению приложен файл. Размер - 13Kb
26 май 16, 11:46    [19222175]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
Teufel666
Member

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

вот

К сообщению приложен файл. Размер - 3Kb
26 май 16, 11:46    [19222178]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2397
Teufel666,

1) если у вас на вставку придет нескоклько строк, как вы думаете - что случится?
2) какую транзакцию вы отктываете?
3) ошибка "Недопустимое имя объекта" мб из-за не тех символов, или код открыт в контексте другой базы
26 май 16, 12:02    [19222276]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Teufel666,

вы хотите откатить и саму вставку в Order? конкретно што бы это заработало, откройте транзакцию после ROLLBACK, а вообще судя по всему вам нужен INSTEAD OF а не AFTER INSERT, это если вы действительно хотите окатить вставку в ORDER
26 май 16, 12:05    [19222297]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
iap
Member

Откуда: Москва
Сообщений: 47066
Teufel666
TaPaK,

вот

Картинка с другого сайта.
Если триггера ещё нет, то и ALTER TRIGGER ему не сделать.
Разве не логично?
Перед ALTER TRIGGER напишите
IF OBJECT_ID(N'[dbo].[InsertOrder]','TR') IS NULL
EXEC(N'CREATE TRIGGER [dbo].[InsertOrder] ON [dbo].[Order] FOR INSERT AS RETURN');
GO
Тогда можете запускать сей скрипт сколько угодно раз, даже если триггера ещё нет.
26 май 16, 12:05    [19222300]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Teufel666
TaPaK,

вот

отключите к чертям INTELISENCE :)
26 май 16, 12:06    [19222308]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
iap
Member

Откуда: Москва
Сообщений: 47066
StarikNavy
1) если у вас на вставку придет нескоклько строк, как вы думаете - что случится?
+100500

Teufel666, послушайте мой глупый, но короткий совет: старайтесь не объявлять внутри триггера скалярные переменные.
Разве что для формирования текста сообщения из RAISERROR().
26 май 16, 12:09    [19222329]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
Teufel666
Member

Откуда:
Сообщений: 48
TaPaK
Teufel666
TaPaK,

вот

отключите к чертям INTELISENCE :)


хах)) ну подчеркивание то это уберет, а вот проблему не исправит, вставить, конечно, все еще будет нельзя

и да мне нужен именно AFTER, ведь вставка в Order может не произойти и из-за других причин
26 май 16, 12:17    [19222394]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
Teufel666
Member

Откуда:
Сообщений: 48
StarikNavy
Teufel666,

1) если у вас на вставку придет нескоклько строк, как вы думаете - что случится?
2) какую транзакцию вы отктываете?
3) ошибка "Недопустимое имя объекта" мб из-за не тех символов, или код открыт в контексте другой базы


хм... не могу найти *не те символы* (( вряд ли

а на счет 1-2 да, об этом я не подумала... Думайте надо сделать ограничения на вставку только по 1 записи?
26 май 16, 12:19    [19222404]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
iap
Member

Откуда: Москва
Сообщений: 47066
Teufel666
Думайте надо сделать ограничения на вставку только по 1 записи?
Я думаю, надо написать триггер в предположении, что одновременно вставляется 1 миллиард записей!
26 май 16, 12:23    [19222443]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
Teufel666
Member

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

хотелось бы сначала с этой проблемой разобраться, а потом улучшать
26 май 16, 12:25    [19222459]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
iap
Member

Откуда: Москва
Сообщений: 47066
Teufel666
iap,

хотелось бы сначала с этой проблемой разобраться, а потом улучшать
Нет. Писать триггер для вставки нескольких записей надо сразу.
Ибо ничто не мешает пользоваться таблицами deleted и inserted, которые содержат всё, что надо.
26 май 16, 12:27    [19222481]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
iap
Member

Откуда: Москва
Сообщений: 47066
iap
Teufel666
iap,

хотелось бы сначала с этой проблемой разобраться, а потом улучшать
Нет. Писать триггер для вставки нескольких записей надо сразу.
Ибо ничто не мешает пользоваться таблицами deleted и inserted, которые содержат всё, что надо.
Прошу прощения. В триггере FOR INSERT надо использовать только inserted, конечно же
26 май 16, 12:28    [19222487]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Teufel666
TaPaK
пропущено...

отключите к чертям INTELISENCE :)


хах)) ну подчеркивание то это уберет, а вот проблему не исправит, вставить, конечно, все еще будет нельзя

и да мне нужен именно AFTER, ведь вставка в Order может не произойти и из-за других причин

как тяжко... вы откатываете всёёёё что есть, на это и ругается, что после триггера хочет комитить а нечего, либо откройте транзакцию после ROLLBACK
можно ещё SET XACT_ABORT OFF но это скорее не ваш случай
26 май 16, 12:30    [19222498]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
Teufel666
Member

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

Дописала код так:
IF(@clientCity = @sellerCity)
BEGIN
SELECT @idClient = (SELECT idClient FROM inserted)
SELECT @idOrder = (SELECT id FROM inserted)
SELECT @idSeller = (SELECT idSeller FROM inserted)
SELECT @dateAndTimeOfOrder = (SELECT dateAndTime FROM inserted)

INSERT INTO OrderHistory (idClient, idOrder, idSeller, type, dateAndTimeOfOrder, dateAndTimeOfOperation)
VALUES (@idClient, @idOrder, @idSeller, 'INSERT', @dateAndTimeOfOrder, SYSDATETIMEOFFSET())
COMMIT TRANSACTION
END
ELSE
ROLLBACK TRANSACTION
это имелось ввиду? (COMMIT TRANSACTION) не помогло...

пошла гуглить про SET XACT_ABORT OFF
26 май 16, 12:33    [19222527]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Teufel666,

вы точно хотите откатывать вставку в ORDER????

и открыть транзакцию BEGIN TRAN != COMMIT TRAN

ELSE
ROLLBACK TRANSACTION
BEGIN TRANSACTION
END
26 май 16, 12:35    [19222534]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
Teufel666
Member

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

да я хочу откатывать добавление в Order, если покупатель и продавец не из 1 города, такое уж учебное задание))

зачем открывать новую транзакцию? мне просто нужно отменить вставку если @clientCity != @sellerCity
26 май 16, 12:38    [19222557]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Teufel666,

потому что ваш автокомит жаждет комитить, он рождён с этой целью, а у него отобрали печеньку какой-то триггер, и он так вам в ошибке и пишет - "Телеграфирую. Отобрали. Недоволен"
26 май 16, 12:40    [19222568]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
Konst_One
Member

Откуда:
Сообщений: 11593
SET @idClient = (SELECT TOP 1 idClient FROM inserted)
SET @idOrder = (SELECT  TOP 1 id FROM inserted)
SET @idSeller = (SELECT  TOP 1 idSeller FROM inserted)
SET @dateAndTimeOfOrder = (SELECT  TOP 1 dateAndTime FROM inserted)


может так?
но всё равно учтите , что могут вставляться несколько записей сразу
26 май 16, 12:40    [19222571]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
iap
Member

Откуда: Москва
Сообщений: 47066
Teufel666
TaPaK,

Дописала код так:
IF(@clientCity = @sellerCity)
BEGIN
SELECT @idClient = (SELECT idClient FROM inserted)
SELECT @idOrder = (SELECT id FROM inserted)
SELECT @idSeller = (SELECT idSeller FROM inserted)
SELECT @dateAndTimeOfOrder = (SELECT dateAndTime FROM inserted)

INSERT INTO OrderHistory (idClient, idOrder, idSeller, type, dateAndTimeOfOrder, dateAndTimeOfOperation)
VALUES (@idClient, @idOrder, @idSeller, 'INSERT', @dateAndTimeOfOrder, SYSDATETIMEOFFSET())
COMMIT TRANSACTION
END
ELSE
ROLLBACK TRANSACTION
это имелось ввиду? (COMMIT TRANSACTION) не помогло...

пошла гуглить про SET XACT_ABORT OFF
Вы только про INSERT ... VALUES() прочитали?
Про INSERT ... SELECT даже не подозреваете?
26 май 16, 12:44    [19222589]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка с триггером  [new]
Teufel666
Member

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

ой все понятно... триггер изначально работал!!! и правильно все делал...города то там в таблицах разные...
не подумала, когда вбивала тестовые данные))) спасибо за помощь
пойду доделаю для вставки нескольких значений...
26 май 16, 12:49    [19222624]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить