Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Поправил следующим тригг
Guest |
volt, Охренительный CROSS JOIN чудесным образом оттеняет общий трупный аромат этого ужаса легкими нотками запекшейся крови из простреленной ноги. |
20 фев 18, 17:13 [21205798] Ответить | Цитировать Сообщить модератору |
volt Member Откуда: Сообщений: 105 |
Поправил следующим тригг, Я уже обнаружил, что это неправильно... |
20 фев 18, 17:16 [21205816] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
volt, ну что бы связать ваше цену с ИД, да ещё и из представления, я могу придумать только вариант с MERGE вместо insert и да, я считаю это всё полным извращением :) |
20 фев 18, 17:42 [21205926] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9633 |
TaPaK, MERGE вполне себе способ. А вот полное извращение - это создать для Ассортимент представление с фейковым столбцом цена и триггером instead of insert. |
20 фев 18, 18:18 [21206048] Ответить | Цитировать Сообщить модератору |
volt Member Откуда: Сообщений: 105 |
invm, К сожалению, проблема глубже... Есть бд написанная на Access. ЕЕ надо перевести на SQL самым простым способом.. Поэтому особенно лезть в логику БД нет желания, и приходится строить костыли. |
21 фев 18, 10:24 [21207060] Ответить | Цитировать Сообщить модератору |
Дедушка Member Откуда: Город трёх революций Сообщений: 5114 |
|
||
21 фев 18, 12:24 [21207595] Ответить | Цитировать Сообщить модератору |
Шыфл Member Откуда: Прага Сообщений: 776 |
Дедушка, утілізація Access пріложеній - это отдельное конг-фу, которое корміт меня уже не первый год. І почті всё там завісіт от угла крівізны рук ісходного кода. Но перепісывать формляр вставкі через instead of тріггер мне бы не прішло в голову... Да і вообсче, трігеров в Аксе нет, нафіга іх плодіть? |
21 фев 18, 13:59 [21208017] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |