Search

onze sponsors

microsoft_logo.gif


 

computrain_logo.JPG

Forum Login | Register
   Forum

 

Subject: Ik wil geen ROLLBACK op alle statements
Prev Next
You are not authorized to post a reply.

Author Messages
Ellen HeijmansUser is Offline

Posts:101

18-03-2009 20:22:03 Alert 
Ik heb een sp waar wat mee is. Bij alle klanten werkt het goed, en dat al geruime tijd, maar bij een klant geeft het problemen. Omdat ik niet kan ontdekken wat het probleem is (het lijkt wel of sommige statements die fout moeten gaan, geen foutmelding geven), heb ik regels toegevoegd om info naar een logboek te schrijven. Maar, je raadt het al, bij een fout worden ook de logboekregels gerollbacked. Ik schiet dus niet op. Het wegschrijven naar logboek in een aparte sp zetten helpt niet (gedaan als test op een plek), een ook niet om er meerdere transactions van te maken.

Iemand enig idee hoe ik dit kan oplossen? Deel van de code staat hieronder.

BEGIN TRY

BEGIN TRAN Fiatteren

SET DATEFIRST 1

--Melding over het aantal te kopiëren records wegschrijven naar het logboek
DECLARE @Aantal int, @Melding nvarchar(4000)
SET @Aantal = (SELECT COUNT(*) FROM dbo.ESS_dwwuren
WHERE Personeelsnummer = @Personeelsnummer
   AND (dbo.fn_WeeknummerISO(Datum) = @Week AND YEAR(dbo.fn_BepaalEinddatumWeek(Datum)) = @Jaar))

begin tran logboekschrijven
   SET @Melding = 'Wegschrijven van uren (' + CAST(@Aantal AS varchar(5)) + ' records) uit ESS_dwwuren naar Dwwuren'
   EXEC proc_Schrijven_Logboek @Personeelsnummer, @Week, @Jaar, @Melding
commit tran logboekschrijven

--Ook even wegschrijven of er zich al toevallig records voor deze week in dwwuren bevinden (kan een PK-constraint-error opleveren)
SET @Aantal = (SELECT COUNT(*) FROM dbo.dwwuren
WHERE Personeelsnummer = @Personeelsnummer
   AND (dbo.fn_WeeknummerISO(Datum) = @Week AND YEAR(dbo.fn_BepaalEinddatumWeek(Datum)) = @Jaar))

IF @Aantal > 0
   EXEC proc_Schrijven_Logboek @Personeelsnummer, @Week, @Jaar, 'Er bevinden zich al records voor deze week en personeelsnummer in dwwuren'
ELSE
   EXEC proc_Schrijven_Logboek @Personeelsnummer, @Week, @Jaar, 'Er bevinden zich geen records voor deze week en personeelsnummer in dwwuren'

--Het wegschrijven van de uren in de PlanRadtabel
INSERT INTO dbo.dwwuren (Personeelsnummer, Projectnummer, Datum, Soort, Uren, Opmerking, ESS_Gewijzigd)
   SELECT Personeelsnummer, Projectnummer, Datum, Soort, Uren, Opmerking, 1 FROM dbo.ESS_dwwuren
   WHERE Personeelsnummer = @Personeelsnummer
      AND (dbo.fn_WeeknummerISO(Datum) = @Week AND YEAR(dbo.fn_BepaalEinddatumWeek(Datum)) = @Jaar)

--Het wegschrijven van de uren in de PlanRadtabel
INSERT INTO dbo.ESS_GefiatteerdeUren
   SELECT Personeelsnummer, Projectnummer, Datum, Soort, Uren, Opmerking FROM dbo.ESS_dwwuren
   WHERE Personeelsnummer = @Personeelsnummer
      AND (dbo.fn_WeeknummerISO(Datum) = @Week AND YEAR(dbo.fn_BepaalEinddatumWeek(Datum)) = @Jaar)

--Melding over het resultaat van het kopiëren wegschrijven naar het logboek
IF EXISTS
(
   SELECT * FROM dbo.ESS_dwwuren
   WHERE Personeelsnummer = @Personeelsnummer
      AND (dbo.fn_WeeknummerISO(Datum) = @Week AND YEAR(dbo.fn_BepaalEinddatumWeek(Datum)) = @Jaar)
)
   EXEC proc_Schrijven_Logboek @Personeelsnummer, @Week, @Jaar, 'De uren bevinden zich inderdaad in de tabel Dwwuren'
ELSE
   BEGIN
      EXEC proc_Schrijven_Logboek @Personeelsnummer, @Week, @Jaar, 'FOUT: De uren bevinden zich NIET in de tabel Dwwuren'
      RAISERROR ('Er is een fout opgetreden bij het fiatteren van week %d voor personeelsnummer %d. De uren zijn NIET naar dwwuren gekopieerd.', 16, 1, @Week, @Personeelsnummer)
END

IF EXISTS
(
   SELECT * FROM dbo.ESS_GefiatteerdeUren
   WHERE Personeelsnummer = @Personeelsnummer
      AND (dbo.fn_WeeknummerISO(Datum) = @Week AND YEAR(dbo.fn_BepaalEinddatumWeek(Datum)) = @Jaar)
)
   EXEC proc_Schrijven_Logboek @Personeelsnummer, @Week, @Jaar, 'De uren zijn naar de tijdelijke tabel gekopieerd'
ELSE
   BEGIN
      EXEC proc_Schrijven_Logboek @Personeelsnummer, @Week, @Jaar, 'FOUT: De uren zijn NIET naar de tijdelijke tabel gekopieerd'
RAISERROR ('Er is een fout opgetreden bij het fiatteren van week %d voor personeelsnummer %d. De uren zijn NIET naar de tijdelijke tabel gekopieerd.', 16, 1, @Week, @Personeelsnummer)
END

--Melding over het wissen wegschrijven naar het logboek
EXEC proc_Schrijven_Logboek @Personeelsnummer, @Week, @Jaar, 'Verwijderen van uren uit Dwwuren'

--Het wissen van de uren in de ESS-tabel
DECLARE @AantalGewisteRecords int
DELETE FROM dbo.ESS_dwwuren
WHERE Personeelsnummer = @Personeelsnummer
   AND (dbo.fn_WeeknummerISO(Datum) = @Week AND YEAR(dbo.fn_BepaalEinddatumWeek(Datum)) = @Jaar)

SET @AantalGewisteRecords = @@ROWCOUNT

--Melding over het resultaat van het verwijderen
IF NOT EXISTS
(
   SELECT * FROM dbo.ESS_dwwuren
   WHERE Personeelsnummer = @Personeelsnummer
      AND (dbo.fn_WeeknummerISO(Datum) = @Week AND YEAR(dbo.fn_BepaalEinddatumWeek(Datum)) = @Jaar)
)
   BEGIN
      SET @Melding = 'Het wissen van de uren is gelukt (' + CAST(@AantalGewisteRecords as varchar(5)) + ' records)'
      EXEC proc_Schrijven_Logboek @Personeelsnummer, @Week, @Jaar, @Melding
   END
ELSE
   EXEC proc_Schrijven_Logboek @Personeelsnummer, @Week, @Jaar, 'FOUT: de uren zijn NIET verwijderd'

COMMIT TRAN

EXEC proc_Schrijven_Logboek @Personeelsnummer, @Week, @Jaar, 'Er zijn geen fouten opgetreden tijdens het fiatteren'

END TRY

BEGIN CATCH

ROLLBACK TRAN Fiatteren

--Wegschrijven van de foutmelding
DECLARE @Foutmelding nvarchar(4000), @Foutnummer as int, @FoutErnst as int

SET @Foutnummer = ERROR_NUMBER()
SET @Foutmelding = ERROR_MESSAGE()
SET @FoutErnst = ERROR_SEVERITY()
SET @Melding = 'Fout ' + CAST(@Foutnummer as nvarchar(400)) + ': ' + @Foutmelding

EXEC proc_Schrijven_Logboek @Personeelsnummer, @Week, @Jaar, @Melding

RAISERROR(@Foutmelding, @FoutErnst, 1)

END CATCH

Robert HartskeerlUser is Offline

Posts:86

18-03-2009 21:15:25 Alert 
Ellen,

dit was een vraag op het 70-451 PRO: Designing Database Solutions and Data Access Using Microsoft SQL Server 2008 examen. De sleutel ligt in table variables (niet te verwarren met table valued parameters in SQL 2008). Een table variable heeft een kleine scope en is niet transactie gevoelig waar een tijdelijke tabel dit wel is. Onderstaande code moet dit duidelijk maken en je op weg helpen naar een oplossing.

create table Logging (logdate smalldatetime, logtext varchar(256));
create table Voorbeeld (Veld1 varchar(50), Veld2 varchar(50));
go

create procedure TestLogging
as
declare @t table (logdate smalldatetime, logtext varchar(256));

begin transaction
insert into @t values(getdate(), 'Start SP...');
insert into Voorbeeld (Veld1, Veld2) values ('Hoi', 'Hoi');

insert into Voorbeeld (Veld1, Veld2) values ('Doei', 'Doei');

insert into @t values(getdate(), 'Einde SP....');

rollback transaction
insert into Logging (logdate, logtext) select logdate, logtext from @t;

go
exec TestLogging;

select Logdate, Logtext from Logging;


You are not authorized to post a reply.
Forums > Forums > Ontwikkelen > Ik wil geen ROLLBACK op alle statements



ActiveForums 3.6
  
Copyright (c) 2012 PASS Nederland   Privacy Statement  Terms Of Use