Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Изменение записи в триггере
|
|||
|---|---|---|---|
|
#18+
Имеется MS SQL Server 7.0. Есть таблица, в которой хранится поле ID, Name и Hash. Hash - результат работы некоторой процедуры по полю Name. Причем значение Hash обязательно нужно хранить в таблице. При изменении Name поле Hash также меняется. Естественным желанием является сделать изменение поля Hash в триггере на INSERT и UPDATE таблицы. Точно знаю, что это можно сделать в Oracle. А как это сделать в MS SQL Server? Если что непонятно - уточню. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2001, 15:20 |
|
||
|
Изменение записи в триггере
|
|||
|---|---|---|---|
|
#18+
А по какому закону должно изменяться поле Hash ? И как оно зависит от значения поля Name ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2001, 15:28 |
|
||
|
Изменение записи в триггере
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2001, 15:42 |
|
||
|
Изменение записи в триггере
|
|||
|---|---|---|---|
|
#18+
Маленькие дополнения 1. Т.к. MS SQL Server 7, то пользовательских функций там еще нет, а вот формулу в качестве столбца можно использовать. 2. т.к. обновляться может несколько записей, то в тригере надежнее сделать так UPDATE TableName SET Hash= new_value FROM TableName INNER JOIN inserted ON TableName.ID = inserted.ID либо проверять количество обновляемых записей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2001, 07:12 |
|
||
|
Изменение записи в триггере
|
|||
|---|---|---|---|
|
#18+
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.: Извините за назойливость. Очень хочется разобраться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2001, 09:38 |
|
||
|
Изменение записи в триггере
|
|||
|---|---|---|---|
|
#18+
Что-то не получается написать курсор в триггере. Эксперты, помогите, пож-та! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2001, 06:40 |
|
||
|
Изменение записи в триггере
|
|||
|---|---|---|---|
|
#18+
Приведи текст триггера. Если нет ошибок - то всё должно быть ОК. У меня курсоры в триггерах используются и работают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2001, 07:38 |
|
||
|
Изменение записи в триггере
|
|||
|---|---|---|---|
|
#18+
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. - Насколько все-таки сложна вашу процедура ? Может быть все-таки можно преобразовать ее в выражение и использовать в запросе ? - Можно так же обновлять/добавлять данные по одной записи - Как вы пытаетесь использовать курсор в триггере - покажите код, место и сообщение об ошибке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2001, 08:13 |
|
||
|
Изменение записи в триггере
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2001, 10:03 |
|
||
|
Изменение записи в триггере
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2001, 10:10 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32019012&tid=1824579]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
51ms |
get topic data: |
6ms |
get forum data: |
3ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 254ms |
| total: | 386ms |

| 0 / 0 |
