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

Откуда:
Сообщений: 105
Добрый день!
есть представление, которое затрагивает две базы данных:
Create view АссортВсе with view_metadata as
SELECT 
  [Глоб-ПоизводствоSQL].dbo.Ассортимент.КодИздел, 
  [Глоб-ПоизводствоSQL].dbo.Ассортимент.Наимен, 
  [Глоб-ПоизводствоSQL].dbo.Ассортимент.Стар, 
  [ГлобSQL].dbo.АссортКонф.Цена, 
  [Глоб-ПоизводствоSQL].dbo.Ассортимент.Назначение, 
  [Глоб-ПоизводствоSQL].dbo.Ассортимент.ПРименяемость
FROM [Глоб-ПоизводствоSQL].dbo.Ассортимент LEFT JOIN [ГлобSQL].dbo.АссортКонф ON [Глоб-ПоизводствоSQL].dbo.Ассортимент.КодИздел = [ГлобSQL].dbo.АссортКонф.КодИздел


Для данного представления пишу следующий триггер:
USE [ТехноSQL]
GO
/****** Object:  Trigger [dbo].[InsteadInsertTriggerAssortimentPoln1]    Script Date: 12.02.2018 10:48:33 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Create TRIGGER [dbo].[InsteadInsertTriggerAssortVse] on [dbo].[АссортВсе]
INSTEAD OF INSERT
AS
BEGIN
  INSERT INTO [Глоб-ПоизводствоSQL].dbo.Ассортимент (наимен, Стар, Назначение, ПРименяемость)
       SELECT  Наимен, Стар, Назначение, ПРименяемость
	   from inserted 
  
  Insert into [ГлобSQL].dbo.АссортКонф(КодИздел, Цена)
       Select КодИздел, Цена
	   from inserted

END;


Проблема в том, что для таблицы [Глоб-поизводствоSQL].dbo.Ассортимент поле КодИздел является уникальным идентификатором, поэтому система его присваивает автоматически. А для таблицы [ГЛОБSQL].dbo.АссортКонф - Это просто поле и если его не задать - заполняется null.

Не могу понять, как правильно дополнить триггер, что бы так же и заполнялось поле КодИздел для таблицы АссортКонф.

Заранее спасибо
20 фев 18, 16:20    [21205557]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером Instead Of Insert  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
volt,
как-то так
	DECLARE @x1  TABLE  (Id int, code VARCHAR(1))

	INSERT INTO dbo.x1 (Code)
	OUTPUT 
		inserted.Id,
		inserted.Code
	   INTO @x1
	SELECT Code
	FROM inserted 
	
	INSERT INTO dbo.x2
	SELECT Id
	FROM @x1
20 фев 18, 16:29    [21205614]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером Instead Of Insert  [new]
volt
Member

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

Написал триггер,

ALTER TRIGGER [dbo].[InsteadInsertTriggerAssortVse2] on [dbo].[АссортВсе]
INSTEAD OF INSERT
AS
BEGIN
  Declare @t table(КодИздел int, цена money)
  INSERT INTO [Глоб-ПоизводствоSQL].dbo.Ассортимент (наимен, Стар, Назначение, ПРименяемость)
    output inserted.КодИздел, inserted.цена into @t
       SELECT  Наимен, Стар, Назначение, ПРименяемость
	   from inserted ;
  
  Insert into [ГлобSQL].dbo.АссортКонф(КодИздел, Цена)
       Select КодИздел, цена from @t

END;


Выдает ошибку - invalid column name 'цена'. Я так понимаю, потому что в таблице Ассортимент отсутствует параметр цена.
20 фев 18, 16:59    [21205748]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером Instead Of Insert  [new]
volt
Member

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

Поправил следующим триггером:

ALTER TRIGGER [dbo].[InsteadInsertTriggerAssortVse2] on [dbo].[АссортВсе]
INSTEAD OF INSERT
AS
BEGIN
  Declare @t table(КодИздел int)
  INSERT INTO [Глоб-ПоизводствоSQL].dbo.Ассортимент (наимен, Стар, Назначение, ПРименяемость)
    output inserted.КодИздел into @t
       SELECT  Наимен, Стар, Назначение, ПРименяемость
	   from inserted ;
  
  Insert into [ГлобSQL].dbo.АссортКонф (КодИздел, Цена) 
    Select qq.КодИздел, цена from @t as qq, inserted


Select qq.КодИздел, цена from @t as qq, inserted
END;


Вроде работает, осталось только проверить, что будет если добавлять одним запросом несколько строк
20 фев 18, 17:09    [21205784]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером Instead Of Insert  [new]
Поправил следующим тригг
Guest
volt,

Охренительный CROSS JOIN чудесным образом оттеняет общий трупный аромат этого ужаса легкими нотками запекшейся крови из простреленной ноги.
20 фев 18, 17:13    [21205798]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером Instead Of Insert  [new]
volt
Member

Откуда:
Сообщений: 105
Поправил следующим тригг,

Я уже обнаружил, что это неправильно...
20 фев 18, 17:16    [21205816]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером Instead Of Insert  [new]
TaPaK
Member

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

ну что бы связать ваше цену с ИД, да ещё и из представления, я могу придумать только вариант с MERGE вместо insert

и да, я считаю это всё полным извращением :)
20 фев 18, 17:42    [21205926]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером Instead Of Insert  [new]
invm
Member

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

MERGE вполне себе способ.
А вот полное извращение - это создать для Ассортимент представление с фейковым столбцом цена и триггером instead of insert.
20 фев 18, 18:18    [21206048]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером Instead Of Insert  [new]
volt
Member

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

К сожалению, проблема глубже... Есть бд написанная на Access. ЕЕ надо перевести на SQL самым простым способом.. Поэтому особенно лезть в логику БД нет желания, и приходится строить костыли.
21 фев 18, 10:24    [21207060]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером Instead Of Insert  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
volt
Есть бд написанная на Access. надо перевести на SQL
перевести ради перевести или чтоб потом работало нормально?
21 фев 18, 12:24    [21207595]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с триггером Instead Of Insert  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 774
Дедушка,

утілізація Access пріложеній - это отдельное конг-фу, которое корміт меня уже не первый год. І почті всё там завісіт от угла крівізны рук ісходного кода. Но перепісывать формляр вставкі через instead of тріггер мне бы не прішло в голову... Да і вообсче, трігеров в Аксе нет, нафіга іх плодіть?
21 фев 18, 13:59    [21208017]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить