trigger and stored procedure (SQL2008 R2)

  • Hy there,

    i have following problem:

    i have a table A, table B and table C with a trigger (after insert, update).

    All tables have the same primary key inserted.

    Of course, when datas are changing in table "auftragkopf " , triggers fires (triggers will select data from inserted and write these datas to another table)

    Second i have a stored procedure A where every 15 minutes an insert in table A happened and also all

    datas from one dataset are selected an written in another table.

    Now i habe the problem, that when the sgtored procedure is running, they key changes and the job failed.

    For example:

    Table A gets a value "1"

    Table B gets a value "1"

    Table C gets a value "1"

    Trigger starts on Table A (and write this new value to another table). At the same time the stored procedure is running

    and insert datas and select all datas from table A, tabble B and table C.

    When a select the table, where datas are inserted from the stored procedure, following datas are inserted:

    Table A gets a value "1"

    Table B gets a value "1"

    Table C gets a value "2"

    Thats wrong, because all values MUST BE "1".

    Here is the stored procedure (runs every 15 minute)

    USE [BD]

    GO

    /****** Object: StoredProcedure [dbo].[Collect] Script Date: 08/14/2013 16:00:58 ******/

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER ON

    GO

    -- =============================================

    -- Author:<Author,,Name>

    -- Create date: <Create Date,,>

    -- Description:<Description,,>

    -- =============================================

    ALTER PROCEDURE [dbo].[Collect

    AS

    BEGIN

    -- SET NOCOUNT ON added to prevent extra result sets from

    -- interfering with SELECT statements.

    SET NOCOUNT ON;

    if (select count(*) from [vb-srv-db1].rls.dbo.vw_getnewrecords) >0

    begin

    SET XACT_ABORT ON

    BEGIN TRANSACTION

    declare @maxint int

    delete from tbl_NewRecords

    insert into tbl_NewRecords select int_nummer from [vb-srv-db1].rls.dbo.vw_getnewrecords

    delete from [vb-srv-db1].rls.dbo.tbl_NewRecords

    insert into [vb-srv-db1].rls.dbo.tbl_NewRecords select * from tbl_NewRecords

    select @maxint = max(int_nummer) from auftragkopf

    If (IDENT_CURRENT('auftragkopf')>@maxint) DBCC CHECKIDENT ('auftragkopf', RESEED,@maxint)

    insert into auftragkopf (UId, Buchungsdatum, Flags, Flags2, Jahr, Laufnummer, LandesverbandNr, BezirksstelleNr, OrtsstelleNr, Kennung, Orgjahr, Orglaufnr,

    Auftragsnr, Protokollnr, Patientnr, Fahrzeugnr, Sammelauftnr, Uebernahmenr, Uebernahmedat, EinsatzNr, EinsatzNrZusatz, Klinik, Ecpnummer,

    Knotenname, Chronologie, Mehrfachtra, Rechnungsdatum, Rechnungsnr, Selbstbehdatum, Selbstbehrechnr, Sammelrechdatum, Sammelrechnr,

    DatentraegerNr, AbrechnungsNr, FibuueberNr, BearbeitModell, AbrechDatum, AbrechModell, UeberleitModell, OPModell, Fehlerliste, Meldung,

    Zugriff_art, Zugriff_von, Zugriff_terminal, Rls_updaten)

    select UId, getdate(), Flags, Flags2, Jahr, Laufnummer, LandesverbandNr, BezirksstelleNr, OrtsstelleNr, Kennung, Orgjahr, Orglaufnr,

    Auftragsnr, Protokollnr, Patientnr, Fahrzeugnr, Sammelauftnr, Uebernahmenr, Uebernahmedat, EinsatzNr, EinsatzNrZusatz, Klinik, Ecpnummer,

    Knotenname, Chronologie, Mehrfachtra, Rechnungsdatum, Rechnungsnr, Selbstbehdatum, Selbstbehrechnr, Sammelrechdatum, Sammelrechnr,

    DatentraegerNr, AbrechnungsNr, FibuueberNr, BearbeitModell, AbrechDatum, AbrechModell, UeberleitModell, OPModell, Fehlerliste, Meldung,

    Zugriff_art, Zugriff_von, Zugriff_terminal, Rls_updaten

    from [vb-srv-db1].rls.dbo.auftragkopf

    where int_nummer in (select int_nummer from rls.dbo.tbl_NewRecords)

    IF @@ERROR <> 0 GOTO ON_ERROR

    insert into auftrag (Buchungsdatum, Int_nummer, Melder, Rueckruf1, Interface1, Name, Patientinfo, Rueckruf2, Interface2, Auftraggeber, AuftraggebFg,

    AuftraggebNr, Rueckruf3, Interface3, Lokalisat, Abholort, Abh_pq, Abh_land, Abh_plz, Abh_ort, Abh_ortkz, Abh_haus, Abh_klasse, Abh_vpnr, Abh_objekt,

    Abholweg, Abholinfo, Zielort, Zie_pq, Zie_land, Zie_plz, Zie_ort, Zie_ortkz, Zie_haus, Zie_klasse, Zie_vpnr, Zie_objekt, Zielweg, Zielinfo,

    VerrDiagnose, VerrDiagnoseNr, VerrDiagnoseText, Diagnose, Diagnosenr, Einstufung, Einstkurz, Einsatzart, Einsatzbez, Transpoart, Transpobez,

    Bemerkung1, Bemerkung2, Bemerkung3, Freitext, Verrdiagcode, Diagnosecode, Einstcode, Einsatzcode, Transpocode, Verscode, VEAart, VEAbez,

    Kennzeich, Type, Typekurz, Fahrz_art, Statusnummer, Besatz1, Besatz1_nr, Besatz2, Besatz2_nr, Besatz3, Besatz3_nr, Besatz4, Besatz4_nr,

    Schicht, Schicht_von, Schicht_bis, Dienstart, Aufnahmezeit, Sollzeit, Meldezeit, Alarmzeit, Beginnzeit, Beginnlok, Abholzeit, Abhollok, Abfahrtszeit,

    Zielzeit, Ziellok, Endezeit, Standortzeit, Einsatz_ab, Einsatz_zi, Zugriff_art, Zugriff_von, Zugriff_terminal, DispoNr, Transportbez, NACACode)

    select getdate(), 0, Melder, Rueckruf1, Interface1, Name, Patientinfo, Rueckruf2, Interface2, Auftraggeber, AuftraggebFg,

    AuftraggebNr, Rueckruf3, Interface3, Lokalisat, Abholort, Abh_pq, Abh_land, Abh_plz, Abh_ort, Abh_ortkz, Abh_haus, Abh_klasse, Abh_vpnr, Abh_objekt,

    Abholweg, Abholinfo, Zielort, Zie_pq, Zie_land, Zie_plz, Zie_ort, Zie_ortkz, Zie_haus, Zie_klasse, Zie_vpnr, Zie_objekt, Zielweg, Zielinfo,

    VerrDiagnose, VerrDiagnoseNr, VerrDiagnoseText, Diagnose, Diagnosenr, Einstufung, Einstkurz, Einsatzart, Einsatzbez, Transpoart, Transpobez,

    Bemerkung1, Bemerkung2, Bemerkung3, Freitext, Verrdiagcode, Diagnosecode, Einstcode, Einsatzcode, Transpocode, Verscode, VEAart, VEAbez,

    Kennzeich, Type, Typekurz, Fahrz_art, Statusnummer, Besatz1, Besatz1_nr, Besatz2, Besatz2_nr, Besatz3, Besatz3_nr, Besatz4, Besatz4_nr,

    Schicht, Schicht_von, Schicht_bis, Dienstart, Aufnahmezeit, Sollzeit, Meldezeit, Alarmzeit, Beginnzeit, Beginnlok, Abholzeit, Abhollok, Abfahrtszeit,

    Zielzeit, Ziellok, Endezeit, Standortzeit, Einsatz_ab, Einsatz_zi, Zugriff_art, Zugriff_von, Zugriff_terminal, DispoNr, Transportbez, NACACode

    from [vb-srv-db1].rls.dbo.auftrag

    where int_nummer in (select int_nummer from rls.dbo.tbl_NewRecords)

    IF @@ERROR <> 0 GOTO ON_ERROR

    insert into auftragnacherf (Buchungsdatum, Int_nummer, Km_start, Km_ende, Km_gefahren, Km_1auftnr, Km_2auftnr, Km_3auftnr, Km_4auftnr, Km_1inland,

    Km_2inland, Km_3inland, Km_4inland, Km_1ausland, Km_2ausland, Km_3ausland, Km_4ausland, Nachname, Vorname, Geschlecht, Gebdatum, Land,

    Plz, Ort, Strasse, Ver_nummer, Ver_name, Ver_vornam, Ver_geschl, Ver_gebdat, Ver_land, Ver_strass, Ver_plz, Ver_ort, Versverhaeltnis, Dienstgeb,

    Dienstplz, Dienstort, Versicher, Versich2, Versich3, VersId, VersId2, VersId3, Versnummer, Selbstbeh, Betragerh, Verrdiag, Verrdiagnr, Verbemerk1,

    Verbemerk2, Verbemerk3, RE_Nachname, RE_Vorname, RE_Plz, RE_Ort, RE_Strasse, RE_Land, Naca, TABei, TAAuchFuer, PatiAnzahl, InkBetrag,

    InkNummer, InkText, InkArt, OPBezahlt, Kostenstelle, HerstName, HerstKfz, HerstPlz, HerstOrt, HerstStrasse, VertragspNr, VertragspDVR,

    VertragspBLZ, VertragspKtoNr, Sammeltransport, Ortspauschale, Selbstbehalt, Uebergabe, Gebuehrenbefreit, Rkmitglied, Gegentransport, IntErhebung,

    Fernfahrt, Nacherfasst, Chefarztpflicht, Mwst, NichtVerrechenbar, Ruecktransport, Mehrfachtransport, Kostenuebernahme, Revers, AufschlRabatt,

    AufschlagAusw, RabattAusw, Bearbeitungsgebuehr, Wartezeit, Porto, Mitgliedrabatt, Zugriff_art, Zugriff_von, Zugriff_terminal)

    select getdate(), 0, Km_start, Km_ende, Km_gefahren, Km_1auftnr, Km_2auftnr, Km_3auftnr, Km_4auftnr, Km_1inland,

    Km_2inland, Km_3inland, Km_4inland, Km_1ausland, Km_2ausland, Km_3ausland, Km_4ausland, Nachname, Vorname, Geschlecht, Gebdatum, Land,

    Plz, Ort, Strasse, Ver_nummer, Ver_name, Ver_vornam, Ver_geschl, Ver_gebdat, Ver_land, Ver_strass, Ver_plz, Ver_ort, Versverhaeltnis, Dienstgeb,

    Dienstplz, Dienstort, Versicher, Versich2, Versich3, VersId, VersId2, VersId3, Versnummer, Selbstbeh, Betragerh, Verrdiag, Verrdiagnr, Verbemerk1,

    Verbemerk2, Verbemerk3, RE_Nachname, RE_Vorname, RE_Plz, RE_Ort, RE_Strasse, RE_Land, Naca, TABei, TAAuchFuer, PatiAnzahl, InkBetrag,

    InkNummer, InkText, InkArt, OPBezahlt, Kostenstelle, HerstName, HerstKfz, HerstPlz, HerstOrt, HerstStrasse, VertragspNr, VertragspDVR,

    VertragspBLZ, VertragspKtoNr, Sammeltransport, Ortspauschale, Selbstbehalt, Uebergabe, Gebuehrenbefreit, Rkmitglied, Gegentransport, IntErhebung,

    Fernfahrt, Nacherfasst, Chefarztpflicht, Mwst, NichtVerrechenbar, Ruecktransport, Mehrfachtransport, Kostenuebernahme, Revers, AufschlRabatt,

    AufschlagAusw, RabattAusw, Bearbeitungsgebuehr, Wartezeit, Porto, Mitgliedrabatt, Zugriff_art, Zugriff_von, Zugriff_terminal

    from [vb-srv-db1].rls.dbo.auftragnacherf

    where int_nummer in (select int_nummer from rls.dbo.tbl_NewRecords)

    IF @@ERROR <> 0 GOTO ON_ERROR

    update auftrag set int_nummer=buchungsnummer where int_nummer=0

    IF @@ERROR <> 0 GOTO ON_ERROR

    update auftragnacherf set int_nummer=buchungsnummer where int_nummer=0

    IF @@ERROR <> 0 GOTO ON_ERROR

    exec [vb-srv-db1].rls.dbo.sp_SetFlags

    IF @@ERROR <> 0 GOTO ON_ERROR

    insert into tbl_Log select 7,getdate(),count(*) from rls.dbo.tbl_NewRecords

    IF @@ERROR <> 0 GOTO ON_ERROR

    print 'commit'

    COMMIT TRANSACTION

    IF @@ERROR <> 0 GOTO ON_ERROR

    GOTO OK

    ON_ERROR:

    IF @@TRANCOUNT > 0 begin

    ROLLBACK TRANSACTION

    print 'error'

    end

    SET XACT_ABORT ON

    OK:

    set nocount off

    SET XACT_ABORT ON

    end

    end

    HERE IS THE TRIGGER (from table A):

    USE [DB]

    GO

    /****** Object: Trigger [dbo].[Changed_Data_AuftragKopf] Script Date: 08/14/2013 16:04:52 ******/

    SET ANSI_NULLS ON

    GO

    SET QUOTED_IDENTIFIER ON

    GO

    ALTER TRIGGER [dbo].[Changed_Data_AuftragKopf]

    ON [dbo].[AuftragKopf]

    AFTER INSERT,UPDATE

    AS

    BEGIN

    DECLARE @Int_Nummer INT

    SET @Int_Nummer = 0

    SET NOCOUNT ON;

    SELECT @Int_Nummer = Int_Nummer FROM dbo.AuftragKopf WHERE Int_Nummer = (Select Int_Nummer from inserted)

    IF (SELECT distinct Int_Nummer FROM dbo.AuftragKopf WHERE Int_Nummer in (select Int_Nummer from dbo.Auftrag_DML) and Int_Nummer = (Select Int_Nummer from inserted)) is null and substring((Select Flags from inserted),3,1)=1

    BEGIN

    INSERT INTO dbo.Auftrag_DML (Int_nummer, DML, ErstellDatum) VALUES(@Int_Nummer , 1 , getdate())

    END

    ELSE

    BEGIN

    UPDATE dbo.Auftrag_DML SET DML = 1, ErstellDatum = getdate()

    WHERE Int_Nummer = @Int_Nummer

    END

    --Bereinigen von alten Daten älter als 10 Tagen; bei jeder Datensatzänderung wird geprüft

    delete FROM [rls].[dbo].[Auftrag_DML] where DATEDIFF(day, getdate(),erstelldatum) < -10

    END

    How can i avoid that trigger and SP mix datas and whats the reason?

    Thank you,

    Chris

Viewing 0 posts

You must be logged in to reply to this topic. Login to reply