Benutzer mit den meisten Antworten
SQL Server 2005 express Trigger

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
endKann mir jemand einen Tip geben ?
Gruß Sascha
Antworten
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 -
Hallo Sascha,
Du mußt dazu Bezug auf die Pseudo-Tabellen inserted (bzw. deleted) nehmen,
siehe Verwenden der Tabellen inserted und deletedFü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
-
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 -
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:
Gruß ElmarPublic 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
-
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.