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

Откуда:
Сообщений: 92
Добрый день.
Необходимо сделать тригер, который при insert или update проверяет из текущей записи заполненность некоторых текстовых полей (пустые или заполнены хоть чем-то) и соотвественно если все n полей заполнены - поставить галочку в текущей записи, если хоть одно из n полей не заполнено - галочку снять.

Пока дошел до такого:

USE [Test2]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[company_full]
   ON [dbo].[Предприятия]
   AFTER INSERT,UPDATE
AS 

BEGIN

	SET NOCOUNT ON;
	IF (inserted.[Название предприятия] IS NULL )
	BEGIN
		-- Производим обновление текущей записи, снимаем галочку
		UPDATE dbo.Предприятия
		SET dbo.Предприятия.Заполнен = 0
		FROM dbo.Предприятия
		INNER JOIN inserted on dbo.Предприятия.КодПредприятия = inserted.КодПредприятия
		WHERE dbo.Предприятия.КодПредприятия = inserted.КодПредприятия
	END;

END;



но запись IF (inserted.[Название предприятия] IS NULL ) уже не корректна, т.е. нельзя просто обратиться и проверить поля в текущей записи, нужно как-то их вытянуть запросом и потом как-то проверить в IF, если я правильно понимаю?
30 авг 13, 09:53    [14774314]     Ответить | Цитировать Сообщить модератору
 Re: Триггер insert, update - проверка заполненности данных  [new]
Glory
Member

Откуда:
Сообщений: 104751
dt88
т.е. нельзя просто обратиться и проверить поля в текущей записи

Пготому что inserted - это таблица. И обращаться к ней надо, как к таблице
30 авг 13, 09:56    [14774337]     Ответить | Цитировать Сообщить модератору
 Re: Триггер insert, update - проверка заполненности данных  [new]
PaulYoung
Member

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

и кстати, Вы в курсе, что псевдотаблицы триггера могут содержать более одной записи?
30 авг 13, 10:03    [14774388]     Ответить | Цитировать Сообщить модератору
 Re: Триггер insert, update - проверка заполненности данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31991
dt88
но запись IF (inserted.[Название предприятия] IS NULL ) уже не корректна, т.е. нельзя просто обратиться и проверить поля в текущей записи, нужно как-то их вытянуть запросом и потом как-то проверить в IF, если я правильно понимаю?
Откуда там "текущая запись"?

Триггер - это просто хранимая процедура, она вызывается сервером, когда он натыкается ни инструкцию INSERT/UPDATE (после их выполнения)

Вот и делайте в триггере то, что сделали бы в обычной хранимой процедуре.
Допустим, проверка наличия записей в таблице inserted делается конструкцией IF EXISTS
30 авг 13, 10:47    [14774689]     Ответить | Цитировать Сообщить модератору
 Re: Триггер insert, update - проверка заполненности данных  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
dt88
Добрый день.
Необходимо сделать тригер, который при insert или update проверяет из текущей записи заполненность некоторых текстовых полей (пустые или заполнены хоть чем-то) и соотвественно если все n полей заполнены - поставить галочку в текущей записи, если хоть одно из n полей не заполнено - галочку снять.


Вычисляемого поля недостаточно будет?
30 авг 13, 11:11    [14774893]     Ответить | Цитировать Сообщить модератору
 Re: Триггер insert, update - проверка заполненности данных  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Безотносительно всего остального: используйте алиасы в запросах.

Тогда вот такое:
dt88
		UPDATE dbo.Предприятия
		SET dbo.Предприятия.Заполнен = 0
		FROM dbo.Предприятия
		INNER JOIN inserted on dbo.Предприятия.КодПредприятия = inserted.КодПредприятия
		WHERE dbo.Предприятия.КодПредприятия = inserted.КодПредприятия
будет выглядеть гораздо лаконичнее:
		UPDATE p
		SET Заполнен = 0
		FROM dbo.Предприятия p
		INNER JOIN inserted i on p.КодПредприятия = i.КодПредприятия
		WHERE p.КодПредприятия = i.КодПредприятия
30 авг 13, 11:15    [14774915]     Ответить | Цитировать Сообщить модератору
 Re: Триггер insert, update - проверка заполненности данных  [new]
qwerty112
Guest
dt88
		-- Производим обновление текущей записи, снимаем галочку
		UPDATE dbo.Предприятия
		SET dbo.Предприятия.Заполнен = 0
		FROM dbo.Предприятия
		INNER JOIN inserted on dbo.Предприятия.КодПредприятия = inserted.КодПредприятия
		WHERE dbo.Предприятия.КодПредприятия = inserted.КодПредприятия


предлагаю ещё добавить HAVING с таким же условием
:))
30 авг 13, 11:26    [14774996]     Ответить | Цитировать Сообщить модератору
 Re: Триггер insert, update - проверка заполненности данных  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
qwerty112
dt88
		-- Производим обновление текущей записи, снимаем галочку
		UPDATE dbo.Предприятия
		SET dbo.Предприятия.Заполнен = 0
		FROM dbo.Предприятия
		INNER JOIN inserted on dbo.Предприятия.КодПредприятия = inserted.КодПредприятия
		WHERE dbo.Предприятия.КодПредприятия = inserted.КодПредприятия



предлагаю ещё добавить HAVING с таким же условием
:))
Ну что такого? План-то, небось, разный с дублированием условия и без.
Может, это реально делает жизнь лучше?
30 авг 13, 14:01    [14776158]     Ответить | Цитировать Сообщить модератору
 Re: Триггер insert, update - проверка заполненности данных  [new]
dt88
Member

Откуда:
Сообщений: 92
PaulYoung
dt88,

и кстати, Вы в курсе, что псевдотаблицы триггера могут содержать более одной записи?


не знал / не подумал, буду знать что необходимо обрабатывать дополнительно, спасибо.


alexeyvg
Откуда там "текущая запись"?


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


qwerty112
предлагаю ещё добавить HAVING с таким же условием
:))


Учёл, спасибо
30 авг 13, 17:22    [14777346]     Ответить | Цитировать Сообщить модератору
 Re: Триггер insert, update - проверка заполненности данных  [new]
не qwerty112
Guest
dt88

qwerty112
предлагаю ещё добавить HAVING с таким же условием
:))


Учёл, спасибо

это же было в порядке издевательства...
30 авг 13, 17:35    [14777425]     Ответить | Цитировать Сообщить модератору
 Re: Триггер insert, update - проверка заполненности данных  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2567
dt88
alexeyvg
Откуда там "текущая запись"?
Я так подумал, что должна быть возможность каким-то образом узнать, изменения в каких записях активировали триггер.
Именно эти записи и будут присутствовать в псевдотаблицах триггера, "текущая запись" есть только у вас в голове.
30 авг 13, 17:52    [14777497]     Ответить | Цитировать Сообщить модератору
 Re: Триггер insert, update - проверка заполненности данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31991
dt88
alexeyvg
Откуда там "текущая запись"?

Я так подумал, что должна быть возможность каким-то образом узнать, изменения в каких записях активировали триггер.
Для этого есть таблицы INSERTED/DELETED

Там даже может и не быть записей, если операция UPDATE не привела к реальным обновлениям данных.

Ещё раз, без понимания принципов вы будете посоянно путаться и делать ошибки. "изменения в каких записях активировали триггер" - это, как я уже говорил, неправильно, изменения не активируют триггер.

Сервер выполняет код (запросы). Как только он встречает один из операторов INSERT, UPDATE, DELETE, он при наличии триггера на таблице запускает его, независимо от того, были какие то изменения или нет, и какие они были.
30 авг 13, 19:05    [14777762]     Ответить | Цитировать Сообщить модератору
 Re: Триггер insert, update - проверка заполненности данных  [new]
dt88
Member

Откуда:
Сообщений: 92
не qwerty112
dt88
пропущено...


Учёл, спасибо

это же было в порядке издевательства...


Понимаю, но всмысле WHERE то в этом выражении действительно лишнее, это и учёл)


Создать сам триггер получилось
Только ещё вопрос небольшой - на случай, если будет UPDATE или INSERT нескольких записей, можно как-то в цикле из триггера пройтись по этим записям и выполнить однотипные действия. (т.к. в самом начале темы я указал, что необходимо анализировать некоторые поля на заполненность - соотвественно каждую строчку необходимо обособленно обрабатывать, думаю, и так каждую следующую)?
По теме циклов в триггерах найти уже второй день ничего внятного не смог ещё..
4 сен 13, 14:13    [14794198]     Ответить | Цитировать Сообщить модератору
 Re: Триггер insert, update - проверка заполненности данных  [new]
iap
Member

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

скорее всего всё делается одной-единственной инструкцией.
Чем скорее забудете слова "цикл", "курсор", - тем лучше!
4 сен 13, 14:18    [14794234]     Ответить | Цитировать Сообщить модератору
 Re: Триггер insert, update - проверка заполненности данных  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2415
dt88
По теме циклов в триггерах найти уже второй день ничего внятного не смог ещё..

ищите просто циклы.
они одинаковы что для триггеров, что для процедур.
но лучше без них
4 сен 13, 15:30    [14794769]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить