Пишет ipanshin,
конструкция 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.
что мягко говоря с точки зрения логики маразм так как оператор инициирует работу тела триггера по удалению. Или я не прав?
А полный текст запроса? View с
Пишет st,
А полный текст запроса? View с with check options?
Это запросINSERT INTO @Inst
Пишет ipanshin,
Это запрос
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 и тогда ошибка исчезает. Но это как раз и подтверждает маразм выдачи сообщения об ошибке.
Что это значит? Может я чего не знаю и можно обойтись без исправления запроса и ошибки не будет?
На первый взгляд кажется, что
Пишет st,
На первый взгляд кажется, что это ошибка SQL Server...
CREATE 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()
Хочу сказать, что вручную перелопатить скрипт не удается. Такие модификации делаются только на основе скриптогенераторов.
7. эта проблема связана, если
Пишет ipanshin,
7. эта проблема связана, если происходит копирование данных сателлитных таблиц одного вью. Результат прост: использование вью в джоине порождает размножение строк в представлении.
Мораль: строки как ни крути должны быть различимы хотя бы по одному полю.
8. Выясняется логическая несов
Пишет ipanshin,
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
--------------------------------------------------------