powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / instead of update & clustered key!
5 сообщений из 5, страница 1 из 1
instead of update & clustered key!
    #32032046
Miha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема возникла с SQL2000+SP2
При использовании instead of update триггера для view,
если таблица имеет кластерный ключ (primary key или unique constraint) возможно изменить записи в таблице нарушая referential constraint но не вызывая ошибки!
Ниже представлен тестовый пример.
Не нашел нигде упоминаний об этой багофиче. Может кто-то сталкивался с подобным, или есть более общее описание этой проблемы?

create table t1 (f1 int primary key, f2 varchar(100))
go
create table t2 (
ff2 varchar(100),
f1 int references t1(f1),
ff1 uniqueidentifier not null default newid()
-- следующая строчка определяет clustered ключ,
-- что и приводит к игнорированию constraint'ов
primary key clustered)
-- если ее заменить на некластерный - получим нормальное
-- поведение (constraint violation error)
-- primary key nonclustered)
go

create view v_t2
as
select ff1, ff2, f1 from t2
go

create trigger iu_v_t2 on v_t2 instead of update
as
set nocount on
set xact_abort on
update t2
set
ff1 = inserted.ff1,
-- уберите предыдущую строчку и получите
-- нормальное поведение даже с кластерным ключем
ff2 = inserted.ff2,
f1 = -1 -- тут специально вызываем constraint violation
from inserted
where inserted.ff1 = t2.ff1
go

insert into t1 values (1,'record1')
insert into t2 (ff2,f1) values ('child record1',1)

-- следующая команда должна вызвать
-- constraint violation error, однако если
-- [t2] имеет clustered key - ошибка не возникает!!!!!
update v_t2 set ff2 = 'modified child1'

select * from v_t2
-- ха-ха! [t2].[f1]=-1 !!! как такое может быть?!
go

drop view v_t2
go
drop table t2
go
drop table t1
go
...
Рейтинг: 0 / 0
instead of update & clustered key!
    #32032050
Dankov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то инфа об этой баге уже проходила...
...
Рейтинг: 0 / 0
instead of update & clustered key!
    #32032054
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего, твой триггер просто не срабатывает, поскольку create view v_t2 должен быть with VIEW_METADATA. Сам когда-то на эти грабли наступил.
...
Рейтинг: 0 / 0
instead of update & clustered key!
    #32032065
Miha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VIEW_METADATA - это другие грабли :)
можно и с ним объявить view - тот же эффект.
триггер как раз срабатывает, а вот constraint не проверяется!
...
Рейтинг: 0 / 0
instead of update & clustered key!
    #32032067
Dankov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Срабатывает, я проверил. И в таблицу действительно сохраняется невалидное значение -1. В этом и вся хрень.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / instead of update & clustered key!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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