Web
Site
Search
Home
Agenda
Links
Bloggers
Over PASS Nederland
User benefits
Geregistreerd... en dan?
Sponsoring
Artikelen
Cursussen en certificering
SQL Server 2000
SQL Server 2005
Examenrecensies
Archief nieuwsbrieven
2005
Nieuwsbrief 1 / 09-10-2005
2006
Nieuwsbrief 2 / 16-01-2006
Nieuwsbrief 3 / 11-03-2006
Nieuwsbrief 4 / 11-04-2006
Nieuwsbrief 5 / 08-05-2006
Nieuwsbrief 6 / 18-06-2006
Nieuwsbrief 7 / 27-08-2006
Nieuwsbrief 8 / 20-10-2006
Nieuwsbrief 9 / 22-12-2006
2007
Nieuwsbrief 10 / 04-02-2007
Nieuwsbrief 11 / 05-03-2007
Nieuwsbrief 12 / 02-04-2007
Nieuwsbrief 13 / 01-05-2007
Nieuwsbrief 14 / 01-06-2007
Nieuwsbrief 15 / 02-09-2007
Nieuwsbrief 16 / 04-10-2007
Nieuwsbrief 17 / 05-11-2007
Nieuwsbrief 18 / 06-12-2007
2008
Nieuwsbrief 19 / 12-01-2008
Nieuwsbrief 20 / 14-02-2008
Nieuwsbrief 21 / 02-05-2008
Nieuwsbrief 22 / 16-06-2008
Nieuwsbrief 23 / 01-08-2008
Nieuwsbrief 24 / 13-11-2008
Nieuwsbrief 25 / 01-12-2008
2009
Nieuwsbrief 26 / 07-02-2009
Nieuwsbrief 27 / 09-03-2009
Nieuwsbrief 28 / 01-04-2009
Nieuwsbrief 29 / 04-06-2009
Nieuwsbrief 30 / 02-09-2009
Nieuwsbrief 31 / 06-10-2009
Nieuwsbrief 32 / 07-11-2009
Nieuwsbrief 33 / 04-12-2009
Forum
onze sponsors
Forum
Login
|
Register
Forum
Unanswered
Active Topics
Forums
Search
Forums
>
Forums
>
Ontwikkelen
Subject: Ik wil geen ROLLBACK op alle statements
Prev
Next
You are not authorized to post a reply.
Author
Messages
Oldest First
Newest First
Ellen Heijmans
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 Hartskeerl
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.
Algemeen
--Forum regels
PASS Nederland
--Aankondigingen
--Bijeenkomsten
--PASS Nederland Algemeen
Forums
--DBA
--Ontwikkelen
--Business Intelligence
--Metadata (SIG)
--Performance (SIG)
--High Availability (SIG)
--XML (SIG)
--Algemeen
SQL Server
Forums
>
Forums
>
Ontwikkelen
> Ik wil geen ROLLBACK op alle statements
ActiveForums 3.6
Copyright (c) 2012 PASS Nederland
Privacy Statement
Terms Of Use