Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Триггер Instead Of Insert / 22 сообщений из 22, страница 1 из 1
27.04.2018, 15:21
    #39637536
volt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Insert
добрый день!

У меня возникла проблема в написании триггера 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 поле не заполнено.

Как правильно написать триггер.
...
Рейтинг: 0 / 0
27.04.2018, 15:25
    #39637542
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Insert
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.
...
Рейтинг: 0 / 0
27.04.2018, 15:27
    #39637544
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Insert
volt,

и завязывайте с запятыми во FROMе
...
Рейтинг: 0 / 0
27.04.2018, 15:27
    #39637546
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Insert
voltSelect table1.id, name, count from Table1, Table2

выполнить то пробовали? ничего странного не заметили?
...
Рейтинг: 0 / 0
27.04.2018, 15:31
    #39637554
volt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Insert
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
...
Рейтинг: 0 / 0
27.04.2018, 15:42
    #39637561
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Insert
триггер то на какую таблицу вешается?
...
Рейтинг: 0 / 0
27.04.2018, 15:44
    #39637563
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Insert
Konst_Oneтриггер то на какую таблицу вешается?Триггер он на view хочет, наверно
...
Рейтинг: 0 / 0
27.04.2018, 15:45
    #39637564
volt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Insert
iap,

Абсолютно верно, я хочу переопределить добавление строки в представлении.
...
Рейтинг: 0 / 0
27.04.2018, 15:45
    #39637565
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Insert
iapKonst_Oneтриггер то на какую таблицу вешается?Триггер он на view хочет, наверно

=)
...
Рейтинг: 0 / 0
27.04.2018, 15:47
    #39637567
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Insert
Мыши плакали, кололись, но продолжали грызть кактус
...
Рейтинг: 0 / 0
27.04.2018, 16:44
    #39637607
volt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Insert
Konst_One,

Есть варианты написания триггера?
...
Рейтинг: 0 / 0
27.04.2018, 16:52
    #39637615
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Insert
неверная архитектура ведёт за собой неверные способы реализации фукционала.
...
Рейтинг: 0 / 0
27.04.2018, 16:56
    #39637619
volt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Insert
Konst_One,

Полностью согласен, к сожалению архитектура досталась от предыдущего разработчика.
...
Рейтинг: 0 / 0
27.04.2018, 16:57
    #39637621
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Insert
Konst_One,

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

insert table1 output table 2

либо то же через merge.
...
Рейтинг: 0 / 0
28.04.2018, 10:29
    #39637896
volt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Insert
Владислав Колосов,

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

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


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

Выдает ошибку. можно чуть подробнее
...
Рейтинг: 0 / 0
28.04.2018, 10:39
    #39637907
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Insert
volt,

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

MSDNТаблица output_table не может:
Иметь включенные триггеры, определенные для нее.
Участвовать в ограничениях FOREIGN KEY с любой стороны.
Иметь ограничения CHECK или активированные правила.
...
Рейтинг: 0 / 0
28.04.2018, 12:54
    #39637994
volt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Insert
Пожалуйста, пример.

Я думал, что знаю SQL, как же я ошибался
...
Рейтинг: 0 / 0
28.04.2018, 13:24
    #39638008
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Insert
voltПожалуйста, пример.

Я думал, что знаю SQL, как же я ошибалсяОбъявите табличную переменную.
OUTPUT - в неё.
Оттуда - с айдишниками для привязки вставляете во вторую таблицу.
...
Рейтинг: 0 / 0
28.04.2018, 13:43
    #39638020
volt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Insert
iap,

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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'. не нравится компилятору строка
...
Рейтинг: 0 / 0
28.04.2018, 13:52
    #39638028
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Insert
voltВыдает ошибку Invalid column name 'count'. не нравится компилятору строка

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

у вас нет такого поля в таблице table1
...
Рейтинг: 0 / 0
28.04.2018, 14:00
    #39638032
volt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Insert
Konst_One,

Я прочитал, посмеялся, согласился. Но править из-за этого все БД я не могу. изменить таблицу, что бы в ней содержались все значения тоже странно выглядит
...
Рейтинг: 0 / 0
28.04.2018, 14:04
    #39638034
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер Instead Of Insert
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Триггер Instead Of Insert / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]