-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hallo,
> -----Urspr�ngliche Nachricht----- > Von: Andreas Roth [mailto:[EMAIL PROTECTED] > Gesendet: Dienstag, 11. Mai 2004 11:56 > An: [EMAIL PROTECTED] > Betreff: AW: [Database.asp] Triggerproblem in SQL-2000 > > > Zu Problem 1: > > Schreibe die varchars, die zu lange sein k�nnen in eine > tempor�re Tabelle > aus der du dann die zu langen l�scht (SET StringFeld = NULL WHERE > LEN(StringFeld)>100 > > Und Joine diese Tabelle > > Zu Problem 2: > > Eine Fortlaufende Nummer innerhalb einer Update Anweisung > bekommst du mit > IDENTITY(@Startwert, @Schrittweite) Hmm, hast Du da noch ein bischen mehr Nachhilfe? Bin vielleicht doch noch zu sehr Access-gesch�digter SQL-2000 Newbie... > > -----Urspr�ngliche Nachricht----- > > Von: [EMAIL PROTECTED] > > [mailto:[EMAIL PROTECTED] Im Auftrag von > > L�tje Dieter (KKK TKEK) > > Gesendet: Dienstag, 11. Mai 2004 09:07 > > An: '[EMAIL PROTECTED]' > > Betreff: [Database.asp] Triggerproblem in SQL-2000 > > > > > > -----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 _______________________________________________ Database.asp Mailingliste, Postings senden an: [EMAIL PROTECTED] An-/Abmeldung und Suchfunktion unter: http://www.glengamoi.com/mailman/listinfo/database.asp 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/AwUBQKCuKkOuiEUnzAm6EQKCWACfSVGtdhIIT/rmD6sOBYJS5N1pYp4AniUu E7T6veW3wkR9s89lx9gml7Rt =um7m -----END PGP SIGNATURE----- _______________________________________________ Database.asp Mailingliste, Postings senden an: [EMAIL PROTECTED] An-/Abmeldung und Suchfunktion unter: http://www.glengamoi.com/mailman/listinfo/database.asp
