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

Откуда:
Сообщений: 105
добрый день!

У меня возникла проблема в написании триггера Instead Of Insert - Упрощенно задача выглядит следующим образом:
Есть две таблицы:
Table1:
Id : (int, not null, identity, PK)
Name : Varchar(50), null

Table2:
Id : (Int, not null, PK) - FK_Table1_Id
Count: (Int, null)

Для этих таблиц создано представление:
create view dbo.[View1]
as
Select table1.id, name, count from Table1, Table2
GO

необходимо написать триггер, который будет заносить записи в таблицы Table1, table2. Основная проблема в том, что поле Table1.Id - Identity, заполняется автоматически. и в таблице inserted поле не заполнено.

Как правильно написать триггер.
27 апр 18, 15:21    [21374387]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Insert  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
volt
добрый день!

У меня возникла проблема в написании триггера Instead Of Insert - Упрощенно задача выглядит следующим образом:
Есть две таблицы:
Table1:
Id : (int, not null, identity, PK)
Name : Varchar(50), null

Table2:
Id : (Int, not null, PK) - FK_Table1_Id
Count: (Int, null)

Для этих таблиц создано представление:
create view dbo.[View1]
as
Select table1.id, name, count from Table1, Table2
GO

необходимо написать триггер, который будет заносить записи в таблицы Table1, table2. Основная проблема в том, что поле Table1.Id - Identity, заполняется автоматически. и в таблице inserted поле не заполнено.

Как правильно написать триггер.
Для начала правильно напишите SELECT для view.
Сейчас там у вас декартово произведение таблиц.

Если поле в одной таблице является и PK, и FK на другую таблицу,
то логичнее иметь одну таблицу. Ибо это отношение 1:1.
27 апр 18, 15:25    [21374411]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Insert  [new]
iap
Member

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

и завязывайте с запятыми во FROMе
27 апр 18, 15:27    [21374416]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Insert  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
volt
Select table1.id, name, count from Table1, Table2


выполнить то пробовали? ничего странного не заметили?
27 апр 18, 15:27    [21374418]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Insert  [new]
volt
Member

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

Прошу прощения. Еще раз:
Table1:
Id int, pk, identity
Name varchar(50)

Table2:
id int, pk, fk_table1_id
Count Int

Представление:
SELECT dbo.Table1.id, dbo.Table1.Name, dbo.Table2.Count
FROM dbo.Table1 LEFT OUTER JOIN
dbo.Table2 ON dbo.Table1.id = dbo.Table2.ID
27 апр 18, 15:31    [21374441]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Insert  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
триггер то на какую таблицу вешается?
27 апр 18, 15:42    [21374495]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Insert  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
Konst_One
триггер то на какую таблицу вешается?
Триггер он на view хочет, наверно
27 апр 18, 15:44    [21374502]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Insert  [new]
volt
Member

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

Абсолютно верно, я хочу переопределить добавление строки в представлении.
27 апр 18, 15:45    [21374507]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Insert  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
iap
Konst_One
триггер то на какую таблицу вешается?
Триггер он на view хочет, наверно


=)
27 апр 18, 15:45    [21374508]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Insert  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
+
Мыши плакали, кололись, но продолжали грызть кактус
27 апр 18, 15:47    [21374512]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Insert  [new]
volt
Member

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

Есть варианты написания триггера?
27 апр 18, 16:44    [21374713]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Insert  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
неверная архитектура ведёт за собой неверные способы реализации фукционала.
27 апр 18, 16:52    [21374729]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Insert  [new]
volt
Member

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

Полностью согласен, к сожалению архитектура досталась от предыдущего разработчика.
27 апр 18, 16:56    [21374737]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Insert  [new]
Владислав Колосов
Member

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

иногда проще написать view, чем перелопатить полторы сотни процедур.

insert table1 output table 2

либо то же через merge.
27 апр 18, 16:57    [21374739]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Insert  [new]
volt
Member

Откуда:
Сообщений: 105
Владислав Колосов,

Спасибо за поддержку.

К сожалению, не понимаю следующий момент


insert table1(name)
output table2.FK_ID
select name from inserted

Выдает ошибку. можно чуть подробнее
28 апр 18, 10:29    [21376354]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Insert  [new]
Посетитель
Member

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

ну, во первых, надо перечислять поля, которые вы хотите получить в output, а потом уже указывать into таблицу, куда вставляете.
а во вторых

MSDN
Таблица output_table не может:
Иметь включенные триггеры, определенные для нее.
Участвовать в ограничениях FOREIGN KEY с любой стороны.
Иметь ограничения CHECK или активированные правила.
28 апр 18, 10:39    [21376382]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Insert  [new]
volt
Member

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

Я думал, что знаю SQL, как же я ошибался
28 апр 18, 12:54    [21376892]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Insert  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
volt
Пожалуйста, пример.

Я думал, что знаю SQL, как же я ошибался
Объявите табличную переменную.
OUTPUT - в неё.
Оттуда - с айдишниками для привязки вставляете во вторую таблицу.
28 апр 18, 13:24    [21377013]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Insert  [new]
volt
Member

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

написал следующий триггер:

declare @t1 table (id int, name varchar(50), Count int)

insert into dbo.[table1] (name)
output
inserted.id,
inserted.name,
[color=red]inserted.count[/color]
into @t1
select name from inserted

insert into dbo.table2 (id, count)
  select id, count from @t1


Выдает ошибку Invalid column name 'count'. не нравится компилятору строка
28 апр 18, 13:43    [21377087]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Insert  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
volt
Выдает ошибку Invalid column name 'count'. не нравится компилятору строка


я же писал вам про мышей и кактус =)

у вас нет такого поля в таблице table1
28 апр 18, 13:52    [21377118]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Insert  [new]
volt
Member

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

Я прочитал, посмеялся, согласился. Но править из-за этого все БД я не могу. изменить таблицу, что бы в ней содержались все значения тоже странно выглядит
28 апр 18, 14:00    [21377139]     Ответить | Цитировать Сообщить модератору
 Re: Триггер Instead Of Insert  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
читайте до просветления

https://docs.microsoft.com/ru-ru/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-2017

этот пукт особо:
https://docs.microsoft.com/ru-ru/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-2017#a-using-output-into-with-a-simple-insert-statement
28 апр 18, 14:04    [21377148]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить