powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Изменение записи в триггере
12 сообщений из 12, страница 1 из 1
Изменение записи в триггере
    #32019011
ASDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется MS SQL Server 7.0. Есть таблица, в которой хранится поле ID, Name и Hash. Hash - результат работы некоторой процедуры по полю Name. Причем значение Hash обязательно нужно хранить в таблице. При изменении Name поле Hash также меняется. Естественным желанием является сделать изменение поля Hash в триггере на INSERT и UPDATE таблицы. Точно знаю, что это можно сделать в Oracle. А как это сделать в MS SQL Server? Если что непонятно - уточню.
...
Рейтинг: 0 / 0
Изменение записи в триггере
    #32019012
Strannij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А по какому закону должно изменяться поле Hash ? И как оно зависит от значения поля Name ?
...
Рейтинг: 0 / 0
Изменение записи в триггере
    #32019015
arnad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1 способ: делаешь функцию от Name и в дизайне таблицы в поле Formula пишешь имя функции с параметрами
2 способ: действительно триггер, а именно
CREATE TRIGGER BeforeInsertUpdate_TableName ON TableName
FOR INSERT, UPDATE

AS
DECLARE @ID int
DECLARE @Name тип_данных
BEGIN
IF UPDATE(Name)
begin
SELECT @ID=ID, @Name=Name FROM inserted
UPDATE TableName
SET Hash=function_name(Name)
WHERE ID=@ID
end

END
...
Рейтинг: 0 / 0
Изменение записи в триггере
    #32019064
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маленькие дополнения
1. Т.к. MS SQL Server 7, то пользовательских функций там еще нет, а вот формулу в качестве столбца можно использовать.

2.
т.к. обновляться может несколько записей, то в тригере надежнее сделать так
UPDATE TableName SET Hash= new_value FROM TableName INNER JOIN inserted ON TableName.ID = inserted.ID
либо проверять количество обновляемых записей
...
Рейтинг: 0 / 0
Изменение записи в триггере
    #32019086
ASDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2arnad:
1. Вычисление Hash довольно сложное, поэтому в одно выражение не запишешь. А пользовательских функций в MS SQL Server 7.0 нет. Приходится пользоваться хранимой процедурой.
2. Поле Formula в дизайне таблицы также не обнаружил. Наверное, это в MS SQL Server 2000.

2Glory:
1. Уточните, пож-та, что значит использовать формулу в качестве столбца.
2. В триггере при добавлении записей они содержатся в таблице inserted. Правильно ли я понимаю по приведенному коду, что эти записи также уже добавлены в таблицу TableName? А иначе что же тогда обновляет UPDATE. Или это работает только в триггере на UPDATE?
3. Поскольку вычисление Hash производится в хранимой процедуре, то нужно, наверное, делать курсор в триггере. Что вы думаете по этому поводу? Может быть, можно как-нибудь по-другому?

P.s.: Извините за назойливость. Очень хочется разобраться.
...
Рейтинг: 0 / 0
Изменение записи в триггере
    #32019158
ASDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то не получается написать курсор в триггере. Эксперты, помогите, пож-та!
...
Рейтинг: 0 / 0
Изменение записи в триггере
    #32019162
SergeK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приведи текст триггера. Если нет ошибок - то всё должно быть ОК. У меня курсоры в триггерах используются и работают.
...
Рейтинг: 0 / 0
Изменение записи в триггере
    #32019168
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Уточнаю - я говорил про тоже, что и arnad, т.е. про вычисляемый столбец(computed column). Это столбец, значение которого получается из значений других столбцов этой же таблицы (в SQL2000 можно использовать и функции, что дает возможность использовать данные из других таблиц). Т.е. это именно вычисляемое выражение.

Насчет доступности вычисляемых столбцов. Работает ли у вас следующий скрипт ?
create table #temp(f1 int, f2 as f1*10)
insert into #temp values(1)
insert into #temp values(5)
select * from #temp
drop table #temp

2. Т.к. у вас SQL7, а там есть только триггеры AFTER, то ответ - да, эти записи в таблице TableName, НО остануться ли они там, зависит от результатов работы триггера.

3.
- Насколько все-таки сложна вашу процедура ? Может быть все-таки можно преобразовать ее в выражение и использовать в запросе ?
- Можно так же обновлять/добавлять данные по одной записи
- Как вы пытаетесь использовать курсор в триггере - покажите код, место и сообщение об ошибке
...
Рейтинг: 0 / 0
Изменение записи в триггере
    #32019186
ASDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Процедура, действительно, сложна. Одним выражением не запишешь.
2. Неизвестно, по одной или нескольким записям будет происходить добавление или обновление, поэтому нужно сделать универсальный вариант, т.е. для нескольких записей.
3. В триггере ошибок нет. Ошибка происходит при добавлении записи - зацикливание. Вот код триггера:

CREATE TRIGGER TableTrigger ON [TableName]
FOR INSERT, UPDATE
AS
BEGIN
DECLARE @ID INT,
@Name VARCHAR (80),
@Hash INT
DECLARE insertedCursor CURSOR FOR
SELECT ID, Name
FROM inserted
IF UPDATE(Name)
BEGIN
OPEN insertedCursor
FETCH insertedCursor INTO @ID, @Name

WHILE @@FETCH_STATUS = 0
BEGIN
EXECUTE sp_GetHash @Name, @Hash OUTPUT

UPDATE [Goods]
SET Hash = @Hash
WHERE ID = @ID
END

CLOSE insertedCursor
DEALLOCATE insertedCursor
END
END
...
Рейтинг: 0 / 0
Изменение записи в триггере
    #32019187
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CREATE TRIGGER TableTrigger ON [TableName]
FOR INSERT, UPDATE
AS
BEGIN
DECLARE @ID INT,
@Name VARCHAR (80),
@Hash INT
DECLARE insertedCursor CURSOR FOR
SELECT ID, Name
FROM inserted
IF UPDATE(Name)
BEGIN
OPEN insertedCursor
FETCH insertedCursor INTO @ID, @Name

WHILE @@FETCH_STATUS = 0
BEGIN
EXECUTE sp_GetHash @Name, @Hash OUTPUT

UPDATE [Goods] SET Hash = @Hash WHERE ID = @ID
FETCH insertedCursor INTO @ID, @Name
-- для того, чтобы @@FETCH_STATUS стало = 0
END

CLOSE insertedCursor
DEALLOCATE insertedCursor
END
END
...
Рейтинг: 0 / 0
Изменение записи в триггере
    #32019190
ASDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Слона-то я и не приметил.
Согласен, лажанулся... Сейчас попробую. Спасибо.
...
Рейтинг: 0 / 0
Изменение записи в триггере
    #32019193
ASDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все заработало. Всем спасибо. Тема закрыта.
P.s.: 2Glory - отдельная благодарность.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Изменение записи в триггере
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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