bestimmte Datenaenderungen verhindern

29/02/2008 - 19:46 von Ulf Kirsten | Report spam
Hallo NG,
ich suche eine elegante Loesung fuer folgendes Problem:
Ich habe eine Tabelle mit einem Feld, das bei neuen Datensaetzen NULL ist
(konkret eine Seriennummer). Es soll dann von Anwendern oder Scripts
einmalig mit einem Wert belegt werden, und ab dann darf es nicht mehr
veraendert werden.
Wahrscheinlich kann man das mit einem Update-Trigger abhandeln, aber ich
habe da nicht so viel Erfahrung damit, insbesondere wie ich das Update dann
verhindern kann - idealerweise nur das Update eben dieses Feldes, d.h. wenn
der Anwender in einer Transaktion andere Felder aendert und auch dieses
"gesperrte" Feld, dann sollen schon die Aenderungen der anderen Felder
gespeichert werden, nur dieses soll auf seinen alten Wert gesetzt werden.
Fuer Ideen ist dankbar
UK aus DD
 

Lesen sie die antworten

#1 Elmar Boye
29/02/2008 - 21:39 | Warnen spam
Hallo Ulf,

Ulf Kirsten schrieb:
ich suche eine elegante Loesung fuer folgendes Problem:
Ich habe eine Tabelle mit einem Feld, das bei neuen Datensaetzen NULL ist
(konkret eine Seriennummer). Es soll dann von Anwendern oder Scripts
einmalig mit einem Wert belegt werden, und ab dann darf es nicht mehr
veraendert werden.
Wahrscheinlich kann man das mit einem Update-Trigger abhandeln,



Das könnte wie im folgenden Beispiel Trigger aussehen, als Alternative
ist ein Zweig mit einem Abbruch der Transaktion auskommentiert enthalten.

Gruß
Elmar

SET NOCOUNT ON
USE tempdb
GO

CREATE TABLE dbo.SerienNummer (
id int NOT NULL IDENTITY(1, 1)
CONSTRAINT PK_SerienNummer PRIMARY KEY,

SerienNr int NULL,
Daten nvarchar(40) NULL)
GO

CREATE TRIGGER TR_SerienNummer_Update
ON dbo.SerienNummer
FOR UPDATE
AS
SET NOCOUNT ON

UPDATE dbo.SerienNummer
SET SerienNr = d.SerienNr
FROM dbo.SerienNummer
INNER JOIN inserted AS i ON SerienNummer.id = i.id
INNER JOIN deleted AS d ON SerienNummer.id = d.id
WHERE d.SerienNr IS NOT NULL
AND (i.SerienNr IS NULL OR i.SerienNr <> d.SerienNr)

/*
IF EXISTS(SELECT * FROM inserted AS i
INNER JOIN deleted AS d ON i.id = d.id
WHERE d.SerienNr IS NOT NULL
AND (i.SerienNr IS NULL OR i.SerienNr <> d.SerienNr))
BEGIN
RAISERROR(N'Die Seriennummer kann nicht geàndert werden.', 16, 1)
IF @@TRANCOUNT > 0 ROLLBACK TRAN
RETURN
END
*/
GO

INSERT INTO dbo.SerienNummer (SerienNr, Daten) VALUES (NULL, '1. Zeile ohne Seriennummer')
INSERT INTO dbo.SerienNummer (SerienNr, Daten) VALUES (NULL, '2. Zeile ohne Seriennummer')
INSERT INTO dbo.SerienNummer (SerienNr, Daten) VALUES (4711, '3. Zeile mit Seriennummer')
INSERT INTO dbo.SerienNummer (SerienNr, Daten) VALUES (4712, '4. Zeile mit Seriennummer')
GO


SELECT * FROM dbo.SerienNummer
GO
UPDATE dbo.SerienNummer
SET Daten = N'Neue SerienNr 4713',
SerienNr = 4713
WHERE id = 1
GO
UPDATE dbo.SerienNummer
SET Daten = N'Seriennummer 4711 (nicht) geàndert.',
SerienNr = 4714
WHERE SerieNnr = 4711
GO
UPDATE dbo.SerienNummer
SET Daten = N'Serien Nr 4712 (nicht) genullt',
SerienNr = NULL
WHERE SerienNr = 4712
GO

SELECT * FROM dbo.SerienNummer
GO


IF OBJECT_ID(N'dbo.SerienNummer', 'U') IS NOT NULL
DROP TABLE dbo.SerienNummer
GO

Ähnliche fragen