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