none
SQL Server 2005 express Trigger RRS feed

  • Frage

  • Hallo,

    möchte einen Trigger programmieren der bei einem Update oder Insert eine Spalte überprüft und einen neuen Wert für die Spalte setzt.

    Also wenn in der zu überprüfenden spalte ein leer String steht dann durch null ersetzen. ( Ich weiß das es unsauber programmiert ist. Hab aber leider keine andere Wahl )

    Hier ist mein Code der aber leider nicht funktioniert:

    KS = Spalte

    dbo.test = Tabelle

     

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO



    CREATE TRIGGER KSLeerString
    on dbo.Test
    for Update
    AS
    Begin
    If (KS is '') Then
    set KS = Null

    end

    end

     

     

    Kann mir jemand einen Tip geben ?

     

    Gruß Sascha

    Donnerstag, 9. Dezember 2010 17:20

Antworten

  • Hallo,

    Management studio -> habe auch aktualisiert.

    Naja habe jetzt den Code geändert.

    Überall wo KS ='' steht macht er Jetzt KS = NULL

     

    Danke für die Hilfe.

    • Als Antwort markiert Sfire83 Mittwoch, 15. Dezember 2010 16:17
    Freitag, 10. Dezember 2010 12:01

Alle Antworten

  • use tempdb
    go
    create table t1(col1 varchar(55) null)
    go
    
    
    create trigger tr_t1_iu
    on t1
    after insert, update
    as
    begin
    	if (exists(select 1 from inserted where len(col1)<1))
    	update t1
    	set col1 = null
    --hier Bedingung für update angeben end go insert into t1(col1) values ('') go select * from t1 go drop table t1 go

    Gruß Yury
    Donnerstag, 9. Dezember 2010 18:17
  • Hallo Sascha,

    Du mußt dazu Bezug auf die Pseudo-Tabellen inserted (bzw. deleted) nehmen,
    siehe Verwenden der Tabellen inserted und deleted

    Für den obigen Fall:

    CREATE TRIGGER TR_Test_InsertUpdate
      ON dbo.Test
      -- bei INSERT und UPDATE ausführen
      FOR INSERT, UPDATE
    AS
      SET NOCOUNT ON; -- Rückmeldungen unterdrücken 
    
      UPDATE dbo.Test
      SET KS = NULL
      FROM dbo.Test 
      INNER JOIN inserted 
    	-- Vernüpfen der Primärschlüsselspalten
    	ON Test.PK = inserted.PK
      WHERE inserted.KS = '';
    GO
    
    

    Gruß Elmar

    Donnerstag, 9. Dezember 2010 19:15
    Beantworter
  • Danke für sie schnelle Antwort:

    Habe aber leider noch ein Problem und zwar habe ich jetzt folgenden Trigger erstellt:

    USE [Test]
    GO
    /****** Object: Trigger [dbo].[TR_InsertUpdate]  Script Date: 12/10/2010 09:21:28 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER TRIGGER [dbo].[TR_InsertUpdate]
     ON [dbo].[Test]
     -- bei INSERT und UPDATE ausführen
     FOR INSERT, UPDATE
    AS
     SET NOCOUNT ON; -- Rückmeldungen unterdrücken 
    
     UPDATE dbo.Test
     SET KS = NULL
     FROM dbo.Test
     INNER JOIN inserted 
    	-- Vernüpfen der Primärschlüsselspalten
    	ON Test.[Alfd-Nr] = inserted.[Alfd-Nr]
     WHERE inserted.KS = '';
    

    wenn ich jetzt von Access aus folgen Code ausführe:

    sollte eigentlich der Trigger KS = Null setzen. Macht er aber nicht.

    Code Access 2000

    dbs.Execute "UPDATE [Test] SET PatNr =8419, QuartaleNr ='10/4', Reihenfolge ='20104', Nachname ='aaa', Vorname ='aaaa', KSQuartal ='10/4', KS ='' where patNr=8419 and QuartaleNr='10/4'",dbseechanges
    Wäre dankbar für jeden Tip

    Freitag, 10. Dezember 2010 09:00
  • Hallo,

    der Trigger funktioniert schon.
    Und wenn ich den Code in Access (2003) ausführe, kommt das auch an - unten mein vervollständigtes Beispiel.
    Das hat aber keine sofortige Auswirkungen auf bereits geöffnete Tabellenansichten, Formulare etc.
    So mußt Du eine Tabellenb/Formular-Ansicht aktualisieren oder neu öffnen.

    Was aber prinzipbedingt gilt, denn Access kann keinen Zusammenhang zwischen der Anweisung
    und z. B. einem Recordset, das z. B. an ein Formular gebunden ist, ermitteln.

    Der Vollständigkeithalber der verwendete Code:

    CREATE TABLE dbo.Test (
    	[Alfd-Nr] int IDENTITY(1,1) NOT NULL PRIMARY KEY,
    	PatNr int NOT NULL,
    	QuartaleNr varchar(10) NOT NULL,
    	Reihenfolge varchar(10) NOT NULL,
    	Nachname varchar(40) NOT NULL,
    	Vorname varchar(40) NOT NULL,
    	KSQuartal varchar(10) NOT NULL,
    	KS varchar(10) NULL);
    GO	
    CREATE TRIGGER [dbo].[TR_Test_InsertUpdate]
     ON [dbo].[Test]
     -- bei INSERT und UPDATE ausführen
     FOR INSERT, UPDATE
    AS
     SET NOCOUNT ON; -- Rückmeldungen unterdrücken 
    
     UPDATE dbo.Test
     SET KS = NULL
     FROM dbo.Test
     INNER JOIN inserted 
    	-- Vernüpfen der Primärschlüsselspalten
    	ON Test.[Alfd-Nr] = inserted.[Alfd-Nr]
     WHERE inserted.KS = '';
    GO
    
    INSERT INTO dbo.Test (PatNr, QuartaleNr, Reihenfolge, Nachname, Vorname, KSQuartal, KS)
    VALUES(8419, '10/4', '20103', 'bbb', 'cccc', '10/3', 'KS');
    SELECT * FROM dbo.Test;
    /*	
    UPDATE [Test] SET PatNr =8419, QuartaleNr ='10/4', Reihenfolge ='20104', Nachname ='aaa', Vorname ='aaaa', KSQuartal ='10/4', KS ='' 
    where patNr=8419 and QuartaleNr='10/4'
    SELECT * FROM dbo.Test;
    */
    	
    
    
    

    und für VBA:

    Public Sub UpdateTest()
      Dim dbs As DAO.Database
      
      Set dbs = CurrentDb
      
      dbs.Execute "UPDATE [Test] " & _
        "SET PatNr =8419, QuartaleNr ='10/4', Reihenfolge ='20104', Nachname ='aaa', Vorname ='aaaa', KSQuartal ='10/4', KS ='' " & _
        "where patNr=8419 and QuartaleNr='10/4'", _
        dbSeeChanges
    End Sub
    
    
    Gruß Elmar

    Freitag, 10. Dezember 2010 09:41
    Beantworter
  • Hallo

    Also den code in access kann ich nicht so einfach verändern weil er zur Laufzeit generiert wird.

    folgendes funktioniert zum testen:

    dbs.Execute "UPDATE [Test] SET  PatNr ='8419',  QuartaleNr ='10/4',  Reihenfolge ='20104',  Nachname ='aaa',  Vorname ='aaaa',  KSQuartal ='10/4',  KS = Null where patNr=8419 and QuartaleNr='10/4'",dbseechanges

     

    aber dies funktioniert nicht :

    dbs.Execute "UPDATE [Test] SET  PatNr ='8419',  QuartaleNr ='10/4',  Reihenfolge ='20104',  Nachname ='aaa',  Vorname ='aaaa',  KSQuartal ='10/4',  KS = '' where patNr=8419 and QuartaleNr='10/4'",dbseechanges

    läuft zwar ohne fehler weiter, aber aktualisiert den Datensatz garnicht.

    Deswegen wollte ich ja einen Trigger schreiben der Wenn KS ='' ist aus KS = null macht.

    Es kann nämlich auch sein das KS = '10/4' ist. Dann soll der Trigger nicht aus KS = null machen.

     

    Freitag, 10. Dezember 2010 10:09
  • Hallo,

    ich habe das bei mir durchlaufen lassen und er aktualisiert...
    Wann, wo und womit hast Du da geguckt?

    Gruß Elmar

    Freitag, 10. Dezember 2010 11:16
    Beantworter
  • Hallo,

    Management studio -> habe auch aktualisiert.

    Naja habe jetzt den Code geändert.

    Überall wo KS ='' steht macht er Jetzt KS = NULL

     

    Danke für die Hilfe.

    • Als Antwort markiert Sfire83 Mittwoch, 15. Dezember 2010 16:17
    Freitag, 10. Dezember 2010 12:01