Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Крутой БАГ в СКЛ2К
|
|||
|---|---|---|---|
|
#18+
Привет, всем. Не поленитесь, посмотрите и офигейте пробовал на всех редакциях СКЛ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 НЕ кластерным. И всЁ заработает, будет ругаться сразу при апдейте ВИДА. ПОМОГИТЕ, что делать, как достучаться до Билли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2001, 07:44 |
|
||
|
Крутой БАГ в СКЛ2К
|
|||
|---|---|---|---|
|
#18+
А самому разобраться с view WITH VIEW_METADATA + instead of trigger слабо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2001, 16:05 |
|
||
|
Крутой БАГ в СКЛ2К
|
|||
|---|---|---|---|
|
#18+
View Metadata тут не причем, его можно и убрать. Владимир, скрипт переправлен на рассмотрение... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2001, 16:30 |
|
||
|
Крутой БАГ в СКЛ2К
|
|||
|---|---|---|---|
|
#18+
Я тут попытался минимизировать объем примера с сохранением смысла. Вот что получилось: 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 срабатывает нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2001, 18:17 |
|
||
|
Крутой БАГ в СКЛ2К
|
|||
|---|---|---|---|
|
#18+
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 тут вообще не при чем, а дело во взаимодействии триггера с составным ключом. Выходит. Именно с кластерным составным, т.к. убираешь признак кластеризации и начинает ругаеться, как миленький. Новерно конкуренты МС офигели бы от такого БАГА. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2001, 07:25 |
|
||
|
Крутой БАГ в СКЛ2К
|
|||
|---|---|---|---|
|
#18+
Глянул, еще Vladimir объявился, стану VladimirCo. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2001, 07:39 |
|
||
|
Крутой БАГ в СКЛ2К
|
|||
|---|---|---|---|
|
#18+
Извините малограмотного, но не имеет ли отношения к этой проблеме следующий текст из SQL Book Online :"Note INSTEAD OF UPDATE triggers cannot be defined on a table that has a foreign key defined with an UPDATE action." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2001, 06:12 |
|
||
|
Крутой БАГ в СКЛ2К
|
|||
|---|---|---|---|
|
#18+
Да, нет. Тут говорится про новую фишку СКЛ2К. Теперь можно сделать внешний ключ с соответсвующими акциями, чтобы сам сервер при зменениях ключа, изменял значения и в соответствующих таблицах. А проблема, должна бойти до МС, мне уже пообещали, что отправят репорт. ЖдЁмс... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2001, 05:44 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=3522&tid=1824604]: |
0ms |
get settings: |
11ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 270ms |
| total: | 393ms |

| 0 / 0 |
