2017-01-28 4 views
0

Так что я смотрел учебник по youtube Instead of insert trigger Part 45 (если кому интересно) около вместо триггеров.SQL вместо вставки триггера путаницы

Парень пытался вставить значения в представление, что невозможно, конечно. Поэтому он сделал вместо триггера, и он использовал вставленную таблицу, чтобы вставить значения в таблицы, из которых сделан вид, длинный рассказ.

Моя точка зрения: как он использовал вставленную таблицу, когда на самом деле ничего не было вставлено?

Я имею в виду, что вы получаете сообщение об ошибке, которое невозможно вставить в представление. Не содержит ли вставленная таблица данные, которые только что были вставлены?

+0

Вместо того, чтобы триггер является функцией в некоторых базах данных системы, которые, отвечая на ваш вопрос, создают некоторый тип курсора с данными, которые вы используете в команде вставки, чтобы вы могли обрабатывать его внутри этого триггера. –

+0

«Вставить значение в представление, что невозможно». о, вы мало веры. Зависит полностью от вида взгляда. В конце концов, представление представляет собой просто сохраненный запрос –

ответ

4

Этот парень пытался вставить значения в представление ..., которое невозможно, конечно.

Это неправда. Представление можно вставить в том случае, если оно соответствует t he rules for updatable views, и значения могут быть однозначно отображены для вставки в одну таблицу.

Не вставлена ​​ли в вставленная таблица данные, которые только что были вставлены ?

Для пульта AFTER INSERT это в основном верно. Строки в псевдо-таблице INSERTED отражают те, которые были вставлены в таблицу. Для запуска INSTEAD OF INSERT рабочий стол создается независимо для хранения данных.

Глядя на пример

CREATE VIEW dbo.Foo 
AS 
SELECT CAST('A' AS varchar(8000)) AS X 

GO 
CREATE TRIGGER TR 
ON Foo 
INSTEAD OF INSERT AS 
SELECT COUNT(*) 
FROM inserted 

А затем пытается

SET STATISTICS IO ON; 
insert into dbo.Foo 
SELECT TOP 1000 REPLICATE('A',8000) 
FROM master..spt_values v1; 

План выполнения показывает, что он вставляет в кластерный индекс на Foo

enter image description here

Существует, курс без кластеризованного индекса на Foo создано выше. Таблица inserted является рабочим столом в tempdb.

В статистике результаты IO показать

Таблица 'Worktable. Количество отсчетов 0, логическое чтение 7619, физическое чтение 0, чтение с чтением 0, логическое считывание логических чисел 0, физическое чтение lob 0, lob read-ahead читает 0. Таблица «spt_values». Количество сканирования 1, логический считывает 8, физических чтений 0, упреждающего чтения читает 0, Лоб логического читает 0, лоб физических чтений 0, лоб упреждающего чтения читает 0.

(1 строк (ы) пострадавших) Таблица 'Рабочий стол'. Число сканирования 1, логическое чтение 1002, физическое считывание 0, чтение вперед 0, логическое считывание 0, lob физическое чтение 0, чтение с чтением lob 0.

(1000 строк (ы) пострадавших)

Первая ссылка для вставки в него, второй для SELECT в самой триггера

+0

ok купить, моя точка была ... для вставленной таблицы ... почему, если она фактически не вставляет ничего, то почему вставленная таблица имеет в ней значения? – john

+0

@john - Когда вы вставляете в представление с вместо триггера, значения вставляются в рабочий стол с той же схемой, что и представление. Для того, чтобы вы сделали то, что хотите, в триггере. –

+0

oh, значит, я могу получить ошибку вставки, но все же значения, которые я пытался вставить, попали бы в «вставленную» таблицу? – john

Смежные вопросы