-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hallo,
ich versuch mich gerade daran ein kombinierten Trigger im SQL-Server
zu erstellen. Vom Prinzip her ist das ja auch erstmal kein Problem,
aber - die beiden folgenden Situationen kriege ich noch nicht hin.
Gegeben sind die beiden folgenden Tabellen,
tblA
lng_AId str_AFeld1 str_AFeld2 str_AFeld3
1 x1 x2 x3
112 b1 b2 b3
113 c1 c2 c3
tblAA
lng_AAid lnk_AId str_AAFeld
1 1 x
2 1 y
3 1 z
3 112 x
4 112 y
5 112 z
6 113 x
7 113 y
8 113 z
sowie der weiter unten aufgelistete Trigger.
Mein erstes Problem entsteht durch die folgende Anweisung:
UPDATE tblA
SET str_AFeld1='a1', str_AFeld2='a2', str_AFeld3='a3'
WHERE lng_AId = 1
Solange die Zuweisungen in allen Feldern funktionieren, klappt das ja
auch. Was aber, wenn der String z.B. f�r str_AFeld2 zu gro� ist? Dann
l�uft der Trigger in das Rollback und nimmt auch die �nderung f�r das
Feld str_AFeld1 wieder zur�ck. Kann man das irgendwie so zaubern, das
dann die �nderung f�r str_AFeld1 beibehalten wird, f�r's zweite Feld
nicht ausgef�hrt, und das 3. Feld auch noch richtig behandelt wird?
Mein n�chstes Problem beruht auf der Forderung "sch�ne" fortlaufende
Nummern haben zu m�ssen (nicht zu wollen! Ich weis dass das Quatsch
ist, aber erz�hl das mal einem Chef). Also, die Anweisung
UPDATE tblA
SET lng_AId = 2
WHERE lng_AId = 112
funktioniert ja tadellos. Wenn ich aber mittels der Anweisung
UPDATE tblA
SET lng_AId = lng_AId - 100
WHERE lng_AId > 100
gleich mehrere Zeilen updaten will, leg' ich mir die Karten, wie ich
das dem Trigger (im Code bei "???") beibringen soll. Hat da mal
irgendjemand einen Denkanstoss f�r mich?
CREATE TRIGGER [TR_tblA] ON [dbo].[tblA]
FOR INSERT, UPDATE, DELETE
AS
- -- *********************************************************
- -- *** Deklaration der Variablen ***************************
- -- *********************************************************
DECLARE @lngDeletedRecords AS Integer
DECLARE @lngInsertedRecords AS Integer
DECLARE @lngError AS Integer
- -- *********************************************************
- -- * Transact-SQL Anzahlmeldungen ausschalten.
- -- *********************************************************
SET NOCOUNT ON
- -- *********************************************************
- -- * Anzahl der gel�schten und der eingef�gten Records
- -- * ermitteln.
- -- *********************************************************
SELECT @lngDeletedRecords = (SELECT COUNT(*) FROM deleted)
SELECT @lngInsertedRecords = (SELECT COUNT(*) FROM inserted)
- -- *********************************************************
- -- * Wenn in der Tabelle deleted wenigstens ein, und in der
- -- * Tabelle inserted gar kein Record �bermittelt wurden,
- -- *********************************************************
IF @lngDeletedRecords > 0 AND
@lngInsertedRecords = 0 BEGIN
-- ***************************************************
-- * wurde der Delete-Trigger ausgel�st. In diesem
-- * Fall l�schen wir einfach alle �ber die Tabelle
-- * deleted zum L�schen ausgew�hlten Datens�tze.
-- * Falls es dabei zu einem Fehler kommt, gibt's f�r
-- * die ganze Transaktion halt ein Rollback.
-- ***************************************************
DELETE tblA FROM tblA, deleted
WHERE tblA.lng_AId = deleted.lng_AId
SET @lngError = @@Error
IF @lngError <> 0 BEGIN
ROLLBACK
END
END
ELSE BEGIN
-- ***************************************************
-- * Wenn in der Tabelle deleted gar kein Record, und
-- * in der Tabelle inserted wenigstens ein Record
-- * �bermittelt wurden,
-- ***************************************************
IF @lngDeletedRecords = 0 AND
@lngInsertedRecords > 0 BEGIN
-- *********************************************
-- * wurde der Insert-Trigger ausgel�st, den wir
-- * hier aber noch gar nicht brauchen.
-- *********************************************
Print CAST(@lngInsertedRecords AS Varchar) +
" Record(s) wurden eingef�gt"
END
ELSE BEGIN
-- *********************************************
-- * sonst wurde der Update-Trigger ausgel�st.
-- * Wenn es sich in diesem Fall nur um einen
-- * ver�nderten Datensatz handelt,
-- *********************************************
IF @lngDeletedRecords = 1 BEGIN
-- ***************************************
-- * f�hren wir halt die entsprechenden
-- * �nderungen in dem oder den Feld bzw.
-- * Feldern durch.
-- ***************************************
IF UPDATE(lng_AId) BEGIN
UPDATE tblAA
SET lnk_AId = (SELECT lng_AId FROM
inserted)
WHERE lnk_AId = (SELECT lng_AId FROM
deleted)
SET @lngError = @@Error
IF @lngError <> 0 BEGIN
ROLLBACK
END
END
IF UPDATE(str_AFeld1) BEGIN
-- *** Hier �nderungen f�r Feld1
SET @lngError = @@Error
IF @lngError <> 0 BEGIN
ROLLBACK
END
END
IF UPDATE(str_AFeld2) BEGIN
-- *** Hier �nderungen f�r Feld2
SET @lngError = @@Error
IF @lngError <> 0 BEGIN
ROLLBACK
END
END
IF UPDATE(str_AFeld1) BEGIN
-- *** Hier �nderungen f�r Feld3
SET @lngError = @@Error
IF @lngError <> 0 BEGIN
ROLLBACK
END
END
END
ELSE BEGIN
-- ***************************************
-- * ???
-- ***************************************
Print "Mehrere Updatezeilen werden noch nicht
unterst�tzt..."
Rollback
END
END
END
- -- *********************************************************
- -- * Transact-SQL Anzahlmeldungen einschalten.
- -- *********************************************************
SET NOCOUNT OFF
mfG - D. L�tje
- ---
\\|||// //|||\\
| | (� �)
(.) (.) "
==============oOO==(_)==OOo=============��O===�==O��==============
Dieter L�tje, Kernkraftwerk Kr�mmel, Elbuferstr. 82, D-21502
Geesthacht.
Tel.: +49 (0)4152 - 15 23 25, Fax: +49 (0)4152 - 15 23 39.
eMail: [EMAIL PROTECTED]
PGP-Key at: idap://certserver.pgp.com or
PGP-Fingerprint: C52A 5AEC 91B1 7F84 3BCA F406 43AE 8845 27CC 09BA
-----BEGIN PGP SIGNATURE-----
Version: PGPfreeware 7.0.3 for non-commercial use <http://www.pgp.com>
iQA/AwUBQKCKp0OuiEUnzAm6EQKrFgCfXQpX0brTEW7NhtTENQ+/7B9st88Aniyq
QQhW4bC/VhYefGJXqY/0eKQp
=s8vJ
-----END PGP SIGNATURE-----
_______________________________________________
Database.asp Mailingliste, Postings senden an:
[EMAIL PROTECTED]
An-/Abmeldung und Suchfunktion unter:
http://www.glengamoi.com/mailman/listinfo/database.asp