powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Крутой БАГ в СКЛ2К
8 сообщений из 8, страница 1 из 1
Крутой БАГ в СКЛ2К
    #32018774
Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, всем.

Не поленитесь, посмотрите и офигейте пробовал на всех редакциях СКЛ2К и 2-х сервиспаках.
Не работает основная вещь - FOREIGN KEY.

CREATE TABLE [dbo].[diObjectType] ( [ObjectTypeID] [smallint] NOT NULL ) ON
[PRIMARY]
GO
CREATE TABLE [dbo].[diObjectPurpose] ( [ObjectPurposeID] [smallint] NOT
NULL ) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Object] ( [ObjectID] [int] NOT NULL ) ON [PRIMARY]
GO
CREATE TABLE [dbo].[cpObject2] (
[ObjectTypeID] [smallint] NOT NULL ,
[ObjectID] [int] NOT NULL ,
[ObjectPurposeID] [smallint] NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[diObjectType] WITH NOCHECK ADD
CONSTRAINT [PK_ObjectType] PRIMARY KEY CLUSTERED ( [ObjectTypeID] ) ON
[PRIMARY]
GO
ALTER TABLE [dbo].[diObjectPurpose] WITH NOCHECK ADD
CONSTRAINT [PK_ObjectPurpose] PRIMARY KEY CLUSTERED (
[ObjectPurposeID] ) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Object] WITH NOCHECK ADD
CONSTRAINT [PK_Object] PRIMARY KEY CLUSTERED ( [ObjectID] ) ON
[PRIMARY]
GO
ALTER TABLE [dbo].[cpObject2] WITH NOCHECK ADD
CONSTRAINT [PK_cpObject2] PRIMARY KEY CLUSTERED ( [ObjectTypeID],
[ObjectID] ) ON [PRIMARY]
GO
CREATE UNIQUE INDEX [IX_Object] ON [dbo].[Object]([ObjectID]) ON
[PRIMARY]
GO

ALTER TABLE [dbo].[cpObject2] ADD
CONSTRAINT [FK_cpObject2_diObjectPurpose] FOREIGN KEY
( [ObjectPurposeID] ) REFERENCES [dbo].[diObjectPurpose] (
[ObjectPurposeID] ),
CONSTRAINT [FK_cpObject2_Object] FOREIGN KEY
( [ObjectID] ) REFERENCES [dbo].[Object] ( [ObjectID] ),
CONSTRAINT [FK_Object2_ObjectType] FOREIGN KEY
( [ObjectTypeID] ) REFERENCES [dbo].[diObjectType] ( [ObjectTypeID] )
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

CREATE VIEW dbo.obObject_2
WITH VIEW_METADATA
AS
select cp.*
FROM dbo.cpObject2 cp
INNER JOIN dbo.Object on
dbo.Object.ObjectID = cp.ObjectID
left JOIN diObjectPurpose di on
cp.ObjectPurposeID = di.ObjectPurposeID
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

CREATE TRIGGER Sec_cpObject2 ON dbo.cpObject2
FOR UPDATE
AS
select 'tr_ins', * from inserted
select 'tr_del', * from deleted

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

CREATE TRIGGER tr_updObject2 ON [dbo].[obObject_2]
instead of UPDATE
AS
set nocount on
update cpObject2
set ObjectPurposeID = i.ObjectPurposeID,
ObjectTypeID = i.ObjectTypeID
from inserted i
where cpObject2.ObjectID = i.ObjectID
GO

insert diObjectType (ObjectTypeID) values(1)
insert diObjectPurpose(ObjectPurposeID) values(1)
insert Object(ObjectID) values(1)
insert cpObject2(ObjectTypeID, ObjectID, ObjectPurposeID) values(1,1,1)

insert diObjectType (ObjectTypeID) values(2)
insert diObjectPurpose(ObjectPurposeID) values(2)
insert Object(ObjectID) values(2)
insert cpObject2(ObjectTypeID, ObjectID, ObjectPurposeID) values(2,2,2)

--Делаем апдейт ВИДА obObject_2.
-- Example 1
update obObject_2
set ObjectTypeID=123
where ObjectID=2

Получаем(UPDATE statement conflicted with COLUMN FOREIGN KEY
constraint 'FK_Object2_ObjectType'. The conflict occurred in table
'diObjectType', column 'ObjectTypeID')
Это круто!!!!!

--Делаем апдейт ТАБЛИЦЫ cpObject2.
-- Example 2
update cpObject2
set ObjectPurposeID=125
where ObjectID=2

Снова получаем(UPDATE statement conflicted with COLUMN FOREIGN KEY
constraint 'FK_cpObject2_diObjectPurpose'. The conflict occurred in table
'diObjectPurpose', column 'ObjectPurposeID'.)
Ну, супер!!!!!

--И теперь нате. Делаем апдейт ВИДА obObject_2.
-- Example 3
update obObject_2
set ObjectPurposeID=125
where ObjectID=2

Свершилось. Никакой ошибки, левые данные "прекрасно" легли в таблицу cpObject2.
Можно проверит, что FK жив, можно попробовать Пример1 снова и получим нужный еррор, а можно и выполнив:

ALTER TABLE cpObject2 with check check constraint all

Получим (ALTER TABLE statement conflicted with COLUMN FOREIGN KEY
constraint 'FK_cpObject2_diObjectPurpose'. The conflict occurred table
'diObjectPurpose', column 'ObjectPurposeID'.)

Но почему нет этого ПРИ АПДЕЙТЕ 8-[
"Лечится" просто, сделаем PK в нашей таблице cpObject2 НЕ кластерным.
И всЁ заработает, будет ругаться сразу при апдейте ВИДА.

ПОМОГИТЕ, что делать, как достучаться до Билли.
...
Рейтинг: 0 / 0
Крутой БАГ в СКЛ2К
    #32018891
evesq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А самому разобраться с view WITH VIEW_METADATA + instead of trigger слабо?
...
Рейтинг: 0 / 0
Крутой БАГ в СКЛ2К
    #32018895
View Metadata тут не причем, его можно и убрать.
Владимир, скрипт переправлен на рассмотрение...
...
Рейтинг: 0 / 0
Крутой БАГ в СКЛ2К
    #32018909
Фотография cvasil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут попытался минимизировать объем примера с сохранением смысла.
Вот что получилось:

CREATE TABLE diObjectPurpose ( ObjectPurposeID smallint NOT NULL PRIMARY KEY CLUSTERED)
CREATE TABLE cpObject2 (
ObjectTypeID smallint NOT NULL
,ObjectID int NOT NULL
,ObjectPurposeID smallint NULL
,CONSTRAINT PK_cpObject2 PRIMARY KEY CLUSTERED (ObjectTypeID, ObjectID)
,CONSTRAINT FK_cpObject2_diObjectPurpose FOREIGN KEY( ObjectPurposeID ) REFERENCES diObjectPurpose (ObjectPurposeID )
)
GO

CREATE TRIGGER tr_updObject2 ON cpObject2
instead of UPDATE AS
set nocount on
update cpObject2 set ObjectPurposeID = i.ObjectPurposeID, ObjectTypeID = i.ObjectTypeID
from inserted i where cpObject2.ObjectID=i.ObjectID
GO

set nocount on
insert diObjectPurpose(ObjectPurposeID) values(1)
insert diObjectPurpose(ObjectPurposeID) values(2)

insert cpObject2(ObjectTypeID, ObjectID, ObjectPurposeID) values(1,1,1)
insert cpObject2(ObjectTypeID, ObjectID, ObjectPurposeID) values(3,2,2)
GO

update cpObject2 set ObjectPurposeID=123 where ObjectID=2

Выходит view тут вообще не при чем, а дело во взаимодействии триггера с составным ключом.

Вообще само по себе выражение:

update cpObject2
set ObjectPurposeID = i.ObjectPurposeID,
ObjectTypeID = i.ObjectTypeID
from inserted i
where cpObject2.ObjectID = i.ObjectID

выглядит довольно странно, поскольку оно приводит к нарушению PrimaryKey в случае присутствия в таблице cpObject2 строк с повторяющимся ObjectID. На мой взгляд более логично было бы написать:

update cpObject2
set ObjectPurposeID = i.ObjectPurposeID
from inserted i where cpObject2.ObjectID=i.ObjectID and cpObject2.ObjectTypeID = i.ObjectTypeID

В таком случае ForeignKey срабатывает нормально.
...
Рейтинг: 0 / 0
Крутой БАГ в СКЛ2К
    #32018931
Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To evesq: А вам, девочка, видать ваще всЁ слабо.

To all: Простите за грубость. Нервы здают от таких БАГОВ МС.

То cvasil: Огромное спасибо, я пытался выковырнуть пример из моей базы, но был уверен, что виноват вид и триггер, а тут до такого дошло... 8-[

>Вообще само по себе выражение:
>update cpObject2 set ObjectPurposeID = i.ObjectPurposeID,ObjectTypeID = i.ObjectTypeID
>from inserted i where cpObject2.ObjectID = i.ObjectID

>выглядит довольно странно, поскольку оно приводит к нарушению PrimaryKey в случае >присутствия в таблице cpObject2 строк с повторяющимся ObjectID.

Простите, но забыл, конечно, добавить в репорт:

CREATE UNIQUE INDEX [IX_cpObject] ON [dbo].[cpObject2]([ObjectID]) ON [PRIMARY]

По именам маленко понятно. Объекты и типы, типов много, а объект - уникален


>Выходит view тут вообще не при чем, а дело во взаимодействии триггера с составным ключом.

Выходит. Именно с кластерным составным, т.к. убираешь признак кластеризации и начинает ругаеться, как миленький.

Новерно конкуренты МС офигели бы от такого БАГА.
...
Рейтинг: 0 / 0
Крутой БАГ в СКЛ2К
    #32018933
VladimirCo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Глянул, еще Vladimir объявился, стану VladimirCo.
...
Рейтинг: 0 / 0
Крутой БАГ в СКЛ2К
    #32019041
Grigori
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините малограмотного, но не имеет ли отношения к этой проблеме следующий текст из SQL Book Online :"Note INSTEAD OF UPDATE triggers cannot be defined on a table that has a foreign key defined with an UPDATE action."
...
Рейтинг: 0 / 0
Крутой БАГ в СКЛ2К
    #32019059
VladimirCo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, нет.

Тут говорится про новую фишку СКЛ2К.
Теперь можно сделать внешний ключ с соответсвующими акциями, чтобы сам сервер при зменениях ключа, изменял значения и в соответствующих таблицах.

А проблема, должна бойти до МС, мне уже пообещали, что отправят репорт.

ЖдЁмс...
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Крутой БАГ в СКЛ2К
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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