View, join and instead of trigger

конструкция delete view from view join ....
(на view навешен триггер instead of delete)
выдает ошибку

DELETE is not allowed because the statement updates view "dbo.dvsys_files" which participates in a join and has an INSTEAD OF DELETE trigger.
DELETE is not allowed because the statement updates view "dbo.dvsys_instances" which participates in a join and has an INSTEAD OF DELETE trigger.

что мягко говоря с точки зрения логики маразм так как оператор инициирует работу тела триггера по удалению. Или я не прав?

Forums: 

Изображение пользователя ipanshin.

Это запросINSERT INTO @Inst

Это запрос
INSERT INTO @InstanceIDs (InstanceID)
SELECT DISTINCT tProcessMain.[InstanceID]
FROM [dbo].[dvtable_{9D09144D-CAEC-4732-AD4D-EB6A3864714A}] AS tPerformers WITH(NOLOCK)
JOIN [dbo].[dvsys_instances] AS t0 WITH(NOLOCK) ON tPerformers.[InstanceID] = t0.[InstanceID] AND (ISNULL(t0.[Deleted], 0) = 0)
JOIN [dbo].[dvtable_{7213A125-2CA4-40EE-A671-B52850F45E7D}] AS tTaskMain WITH(NOLOCK) ON tTaskMain.[InstanceID] = tPerformers.[InstanceID]
JOIN [dbo].[dvsys_instances] AS t1 WITH(NOLOCK) ON tTaskMain.[ParentProcessID] = t1.[InstanceID] AND (ISNULL(t1.[Deleted], 0) = 0) AND (ISNULL(t1.[Template], 0) = 0)
JOIN [dbo].[dvtable_{0EF6BCCA-7A09-4027-A3A2-D2EEECA1BF4D}] AS tProcessMain WITH(NOLOCK) ON t1.[InstanceID] = tProcessMain.[InstanceID] AND tProcessMain.[State] = 1
WHERE tPerformers.[CurrentRoutingType] = 4

Ранее [dbo].[dvtable_{0EF6BCCA-7A09-4027-A3A2-D2EEECA1BF4D}] было таблицей, а сейчас вьюха с триггерами instead of. Этот запрос выдает ошибку

Msg 414, Level 16, State 1, Procedure dvsys_workflow_detect_active_processes, Line 69
UPDATE is not allowed because the statement updates view "dbo.dvtable_{0EF6BCCA-7A09-4027-A3A2-D2EEECA1BF4D}" which participates in a join and has an INSTEAD OF UPDATE trigger.

Запрос конечно можно переписать без JOIN и тогда ошибка исчезает. Но это как раз и подтверждает маразм выдачи сообщения об ошибке.

View с with check options?

Что это значит? Может я чего не знаю и можно обойтись без исправления запроса и ошибки не будет?

Изображение пользователя ipanshin.

это, видимо, не поможет. Все и

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

Изображение пользователя ipanshin.

Список проблем при переводе от

Список проблем при переводе от таблиц к вью

1. alter table ... references ...
2. hints such as (rowlock)
3. image, textptr, updatetext, etc
4. foreign key constraint
5. update view set ... from view join ...
6. default()

Хочу сказать, что вручную перелопатить скрипт не удается. Такие модификации делаются только на основе скриптогенераторов.

Изображение пользователя ipanshin.

7. эта проблема связана, если

7. эта проблема связана, если происходит копирование данных сателлитных таблиц одного вью. Результат прост: использование вью в джоине порождает размножение строк в представлении.
Мораль: строки как ни крути должны быть различимы хотя бы по одному полю.

Изображение пользователя ipanshin.

8. Выясняется логическая несов

8. Выясняется логическая несовместимость применения instead of trigger with a some constraint

IF EXISTS (SELECT * FROM sysobjects WHERE name='adt'
AND xtype='U') drop table adt

--Delimiter
GO

CREATE TABLE adt (
[RowID] uniqueidentifier ROWGUIDCOL NOT NULL,
[ParentRowID] uniqueidentifier,
) ON [PRIMARY]

--Delimiter
GO

IF EXISTS (SELECT * FROM sysobjects WHERE name='apt'
AND xtype='U') drop table apt

--Delimiter
GO

CREATE TABLE apt (
[RowID] uniqueidentifier ROWGUIDCOL NOT NULL,
) ON [PRIMARY]

--Delimiter
GO

-----

ALTER TABLE adt
ADD CONSTRAINT [pk_adt]
PRIMARY KEY NONCLUSTERED ([RowID])

ALTER TABLE apt ADD CONSTRAINT [pk_apt]
PRIMARY KEY NONCLUSTERED ([RowID])

-----

ALTER TABLE adt
ADD CONSTRAINT [fk_ParentRowID_apt]
FOREIGN KEY (ParentRowID)
REFERENCES apt(RowID)
ON DELETE CASCADE
NOT FOR REPLICATION

-----

insert into apt(rowid) select newid()

select * from apt
select * from adt

insert into adt(rowid) select newid()
update adt set parentrowid='F667D4D5-B435-4A23-885A-F5D2F44222F3'

-- операция удаляет строки и в adt по констрэйнту
delete apt

-- При вводе и обновлении данных происходит запрет констрэйнта
-- в конце опять разрешение. В общем решение м.б. таким.
-----------------------------------------------------------
ALTER TABLE adt nocheck CONSTRAINT [fk_ParentRowID_apt]
update adt set parentrowid=newid()
insert into adt(rowid,ParentRowID) select newid(),newid()
ALTER TABLE adt check CONSTRAINT [fk_ParentRowID_apt]
select * from adt

--------------------------------------------------------