Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите составить триггер.  [new]
all1234
Guest
Добрый вечер. Хотелось бы проконсультироваться по беспокоящему меня вопросу, а так же научиться чему-нибудь новому. :)


Имеется некое подобие таблицы.
Картинка с другого сайта.

Нужно чтобы при добавлении/изменении новой записи, выполнялась проверка данных в столбце "column2", а некоторые значения заменялись на другие.
Например значение "1#3,0,0,1" из строки 4 должно заменяться на "1#2,0,0,1", а остальные же остаться неизменными.

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

Если вас не затруднит, то помогите пожалуйста в решении этой проблемы или задайте направление куда копать, чтобы найти ответы на эти вопросы.

USE [TestBase]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER MyTrigger 
ON [dbo].[Table_1]
AFTER UPDATE, INSERT
AS IF UPDATE(column2)
BEGIN
8 июн 14, 22:21    [16139537]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить триггер.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
all1234
Нужно чтобы при добавлении/изменении новой записи, выполнялась проверка данных в столбце "column2", а некоторые значения заменялись на другие.
Например значение "1#3,0,0,1" из строки 4 должно заменяться на "1#2,0,0,1", а остальные же остаться неизменными.

Я так понял, что это можно сделать посредством триггера, но может есть и какие-то другие варианты?
Да, можно триггерами. Лучше это сделать триггерами INSTEAD OF INSERT/UPDATE
9 июн 14, 01:52    [16139979]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить триггер.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
alexeyvg
Лучше это сделать триггерами INSTEAD OF INSERT/UPDATE
А с чего вы так решили?
all1234
выполнялась проверка данных
Многое зависит от типа проверок.
9 июн 14, 02:53    [16140004]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить триггер.  [new]
Maks_M
Member

Откуда: Bratsk
Сообщений: 58
Mnior,
Логику проверки можно реализовать либо на стороне приложения, либо на сервере БД с использованием триггеров
смотрите в сторону триггеров INSTEAD OF INSERT/UPDATE.
9 июн 14, 05:55    [16140046]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить триггер.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
Mnior
alexeyvg
Лучше это сделать триггерами INSTEAD OF INSERT/UPDATE
А с чего вы так решили?
Я так понял, что всегда значения будут подменяться, тогда зачем 2 раза апдейтить таблицы?
Если подменяться будут редко, то лучше обычный AFTER триггер.
Maks_M
Логику проверки можно реализовать либо на стороне приложения, либо на сервере БД с использованием триггеров
Конечно, лучше такую обработку делать в приложении или в хранимых процедурах, так сказать, API базы данных. Но, думаю, тут ситуация другая, нужно быстро заткнуть дыру в кое как накарябаном приложении... ещё и исходники потеряли :-)
9 июн 14, 09:07    [16140297]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить триггер.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
alexeyvg
тогда зачем 2 раза апдейтить таблицы?
Да я понял чего вы боитесь. Только не понял почему боязнь 2х изменений (что на самом деле не так уж линейно верно) хуже чем дедлоки или потеря целостности данных.
Может я где-то прошляпил, и "проверка данных" вообще не зависит от данных базы, но мне показалось что именно это и делается или возможно имелось ввиду. Если прошляпил, то можно и INSTEAD, и конечно лучше в процедурах, как вы и писали. Если нет, то AFTER (т.е. после закрепления локов).

На счёт 2х изменений. С INSTEAD тоже пишет, разве только в tempdb и не отражается на логах базы.
9 июн 14, 16:55    [16144087]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить триггер.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Mnior
alexeyvg
Лучше это сделать триггерами INSTEAD OF INSERT/UPDATE
А с чего вы так решили?
all1234
выполнялась проверка данных
Многое зависит от типа проверок.



Как сказали выше, вместо того, чтобы вставлять данные, а потом их обновлять, лучше перехватить данные до вставки, привести их в нужный вид и потом вставить. (аналогично с обновлением).
9 июн 14, 17:25    [16144368]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить триггер.  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
a_voronin
Mnior
пропущено...
А с чего вы так решили?
пропущено...
Многое зависит от типа проверок.



Как сказали выше, вместо того, чтобы вставлять данные, а потом их обновлять, лучше перехватить данные до вставки, привести их в нужный вид и потом вставить. (аналогично с обновлением).
Только возникнут некоторые проблемы с получением IDENTITY вставленных записей вне триггера.
9 июн 14, 17:27    [16144384]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить триггер.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
iap
a_voronin
пропущено...



Как сказали выше, вместо того, чтобы вставлять данные, а потом их обновлять, лучше перехватить данные до вставки, привести их в нужный вид и потом вставить. (аналогично с обновлением).
Только возникнут некоторые проблемы с получением IDENTITY вставленных записей вне триггера.


Не вижу причины для появления проблем с IDENTITY, если вы используете SCOPE_IDENTITY() внутри триггера. К тому же, исходная задача касалась только одной таблицы.

В конце концов , есть SEQUENCE, если вы не умеете правильно обыгрывать IDENTITY
9 июн 14, 18:01    [16144620]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить триггер.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
a_voronin
Как сказали выше
И зачем повторятся?
a_voronin
вместо того, чтобы вставлять данные, а потом их обновлять
И снова здравствуйте и вы тоже не поняли.
А главное по невнимательности и бездумности.
Моя фраза "Многое зависит от типа проверок." означает что проверок данных более одной (а не только одна которая пришла вам в голову - данные сами в себе), и на этих варантов надо сфокусироваться и подумать, а что ещё может быть:

К примеру я понял фразу ТС "1#2,0,0,1" как возможное использование Row_Number()OVER() притом в этот момент может быть и другие параллельные вставки/изменения/удаления. Не говоря о других возможных проверках.
9 июн 14, 18:40    [16144760]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить триггер.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
a_voronin
В конце концов , есть SEQUENCE, если вы не умеете правильно обыгрывать IDENTITY
Если бы можно было что-то менять, то тема бы не подымалась вообще. Ибо, как уже было сказано выше, вместо триггера это надо было завернуть в процедуру.
a_voronin
Не вижу причины для появления проблем с IDENTITY
И именно поэтому надо быть аккуратным, чтобы не нарушить код приложения, исходники которого возможно потеряны.
9 июн 14, 18:44    [16144782]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить триггер.  [new]
all1234
Guest
О, какой ажиотаж! Всем спасибо за уделенное внимание. :)
Про исходники все правда, их у меня нет и никогда не было.
Я не буду врать, что все понял, но пока пришел к чему-то такому:

CREATE TRIGGER MyTrigger
	ON [dbo].[Table_1]
	AFTER UPDATE
AS
BEGIN
	DECLARE @true varchar(2000)
	SELECT @true = column2 FROM inserted
	IF @true = '1#3,0,0,1'
	BEGIN
		UPDATE Table_1 SET column2 = '1#2,0,0,1' WHERE column2 = @true
	END
END


Вроде бы пока все срабатывает так, как мне нужно, но какая-то боязнь! :)
Могут быть какие-либо подводные камни, которые я не заметил?
10 июн 14, 10:32    [16147046]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить триггер.  [new]
Glory
Member

Откуда:
Сообщений: 104760
all1234
Могут быть какие-либо подводные камни, которые я не заметил?

inserted - это таблица. Т.е. множество записей, а не одна
10 июн 14, 10:33    [16147063]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить триггер.  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
a_voronin
В конце концов , есть SEQUENCE, если вы не умеете правильно обыгрывать IDENTITY
Сравнение тёплого с мягким.
Да, я вообще не умею обращаться с IDENTITY.
За Вас радуюсь!
10 июн 14, 11:34    [16147568]     Ответить | Цитировать Сообщить модератору
 Re: Помогите составить триггер.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
Glory
all1234
Могут быть какие-либо подводные камни, которые я не заметил?

inserted - это таблица. Т.е. множество записей, а не одна
Ещё ТС забыл, что Table_1 - это тоже таблица, а @true = column2 - это явно не ПК записи :-)
all1234
Я не буду врать, что все понял, но пока пришел к чему-то такому:
Неплохо бы начать с учебника: что такое база, таблица, поле, запись, идентификатор записи. Операторы работы с данными (DML): SELECT UPDATE INSERT DELETE. Что такое хранимая процедура, и её разновидность - триггер.
10 июн 14, 11:40    [16147646]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить