ADO i INSTEAD OF INSERT

avv72

Zdrastvuyte.Pomogite pojaluysta reshit problemu. U menya est view v SQL Server , istochnikom kotorogo yavlyautsya 3 tablici. Klient pishetsya na VB. Soedineniye idet chere ADO.Dlya dobavleniya zapisey v tablici-istochniki ispolsuyu trigger etogo view tipa INSTEAD OF INSERT. Voprosi v sleduyuschem :1. Esli dobavlyat novoyu zapis vo view, ispolzuya QA, to vse OK. Esli cherez programmu , to nichego ne dobavlyaetsya. Vpechatlenie takoe , chto trigger ne vizivaetsya, t.k. v nachale triggera dlya otkladki postavilRAISERROR('111 inserting...',16,3) i connection.errors pokazivaet sovsem drugoe soobschenie. Dlya raboti s view ispolsuyu Recordset.LockType = adLockBatchOptimistic. 2. Mojno li kak-to proverit vizivaetysa trigger ili net.Spasibo bolshoe za pomosch.
11 ответов

avv72

SET NOCOUNT ON в начале триггера есть?


avv72

1. У наших программеров была подобная проблема, когда я поставил на view instead of delete. Надо проверить свойство рекордсета - Is Read Only (или Is Updatable, что-то типа этого), по какой-то причине рекордсет нельзя было обновлять.2. Можно профайлером.


avv72

1. Esli dobavlyat novoyu zapis vo view, ispolzuya QA, to vse OK. Esli cherez programmu , to nichego ne dobavlyaetsya. Vpechatlenie takoe , chto trigger ne vizivaetsya, t.k. v nachale triggera dlya otkladki postavilCREATE VIEW ... WITH VIEW_METADATA ...


avv72

Profiler pokazivaet , chto trigger ne vizivaetsya , kogda vstavka novoy zapisi idet iz VB. Podskajite, pojakuysta, pochemu? Recodset redaktiruemiy.


avv72

Profiler наверное все таки показывает что команда INSERT делается для таблицы а не для представления.Ну тогдаCREATE VIEW ... WITH VIEW_METADATA ...


avv72

Esli ya sozdayu predstavlenie s WITH VIEW_METADATA , to vidaetsya soobschenie:error 4510: could not performe CREATE VIEW because WITH VIEW_METADATA wasspecified and the view is not updatable.


avv72

SET NOCOUNT ON v nachale triggera net.


avv72

to vidaetsya soobschenie:Где выдается ? После каких действий/команд выдается ? Где полный серипт создания представления ?


avv72

Uvajaemiy Glory, zapuskayu sleduyuschiy script v QA i poluchayu oshibku:Could not perform CREATE VIEW because WITH VIEW_METADATA was specified and the view is not updatable.Script:if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tr_wDTCListP_Insert]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)drop trigger [dbo].[tr_wDTCListP_Insert]GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[wDTCListP]') and OBJECTPROPERTY(id, N'IsView') = 1)drop view [dbo].[wDTCListP]GOSET QUOTED_IDENTIFIER ON GOSET ANSI_NULLS ON GOCREATE VIEW dbo.wDTCListP WITH VIEW_METADATA ASSELECT TOP 100 PERCENT dbo.tCodeDTC.ID, dbo.tCode.Code, dbo.tDTC.Name AS DescriptionFROM dbo.tCode INNER JOIN dbo.tCodeDTC ON dbo.tCode.ID = dbo.tCodeDTC.IDCode INNER JOIN dbo.tDTC ON dbo.tCodeDTC.IDDTC = dbo.tDTC.IDORDER BY dbo.tCode.Code, dbo.tDTC.NameGOSET QUOTED_IDENTIFIER OFF GOSET ANSI_NULLS ON GOSET QUOTED_IDENTIFIER ON GOSET ANSI_NULLS ON GOCREATE trigger tr_wDTCListP_Inserton wDTCListPINSTEAD OF INSERTasDeclare @idCode dtIDDeclare @idDTC dtIDDeclare @idCodeDTC dtIDDeclare @NameCode dtCodeDeclare @NameDTC dtNamebegin trandeclare addcursor cursor forSelect id, Code, Description from insertedopen addcursorif @@ERROR > 0 goto ffetch nextfrom addcursorinto @idCodeDTC, @NameCode,@NameDTCprint '@idCodeDTC = ' + str(@idCodeDTC)print ' @NameCode = ' + str( @NameCode)print '@NameDTC = ' + str(@NameDTC)if @idCodeDTC = 0 goto fif @@error > 0 goto fSet @idCode = 0Set select @idCode = tCode.id from tCode where Code = @NameCodeif @@error > 0 goto fif @idCode = 0 begin Set select @idCode = max(ID) + 1 from tCode insert into tCode Values (@idCode, @NAmeCode)end if @@error > 0 goto fSet @idDTC = 0Set select @idDTC = id from tDTC where Name = @NameDTCprint '@idDTC1 = ' + Str(@idDTC)if @@error > 0 goto fif @idDTC = 0 begin Set select @idDTC = max(ID) + 1 from tDTC insert into tDTC Values (@idDTC, @NAmeDTC) print '@idDTC2 = ' + Str(@idDTC)end if @@error > 0 goto fprint '@idDTC3 = ' + Str(@idDTC)insert into tCodeDTC Values (@idCodeDTC,@idCode,@idDTC)print '@@error = ' + str(@@error)if @@error > 0 goto fcommitclose addcursordeallocate addcursorprint 'OK'return f:rollbackclose addcursordeallocate addcursorRAISERROR('ERROR inserting...',16,3)print 'ERROR'return GOSET QUOTED_IDENTIFIER OFF GOSET ANSI_NULLS ON GO


avv72

Тогда прописывать в дебрях клиента что базовой таблицей является само представление. Чтобы в команде INSERT фигурировало именно представление


avv72

Uvajaemiy, Glory!Ogromnoe spasibo za podskazku s WITH VIEW_METADATA . U menya ne poluchalos sozdat view, t.k. on soderjal order data.Seychas vse rabotaet!