-----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

Antwort per Email an