Trigger o. Prozedur erstellen

Hallo liebe www-Gemeinde,

kurz vorweg: Ich bin ein Laie im Bereich SQL, Trigger und Prozeduren schreiben, mit „gefährlichem“ Halbwissen.

Folge Kostellation:
eine MS SQL Datenbank (hier 2000)
eine Tabelle „Personalstamm“ mit ca. 20 Spalten
eine neue Tabelle „PesoKurz“ mit ca. 10 Spalten

Die Tabelle PersoKurz soll immer einen Teil(aktuell) der Daten aus Personalstamm enthalten wobei z.B. in der Tabelle Personalstamm der Wert „PSAnrede = 1“ in der Tabelle PersoKurz auf „Anrede = Herr“ und bei „PSAnrede = 2“ auf „Anrede = Frau“ gesetzt werden soll.
Diverse andere Felder sollen 1:1 übernommen werden.
Was muss ich machen, um das wie beschrieben zu realisieren?

Hier mein erster Versuch: Ist es bis hier noch richtig und wie geht es jetzt weiter?

Vielen Dank für Eure Hilfe
Heiko

IF EXISTS(SELECT * FROM SYSOBJECTS WHERE NAME = ‚tr_Perstamm_Export‘)
DROP TRIGGER tr_Perstamm_Export
GO

CREATE TRIGGER tr_Perstamm_Export ON Personalstamm
FOR INSERT,update
AS
BEGIN
declare @FIRMA SMALLINT,
@PSNR INTEGER,
@PSANREDE SMALLINT
@ANREDE VARCHAR(4),
@PSVORNA VARCHAR(30),
(…)

SELECT
FROM
where
and


– Anrede wird umgesetzt 1 = Herr
– 2 = Frau

if @PSANREDE = 1
begin
set @ANREDE = ‚Herr‘
end
if @PSANREDE = 2
begin
set @ANREDE = ‚Frau‘
end

Die Tabelle PersoKurz soll immer einen Teil(aktuell) der Daten
aus Personalstamm enthalten wobei z.B. in der Tabelle
Personalstamm der Wert „PSAnrede = 1“ in der Tabelle PersoKurz
auf „Anrede = Herr“ und bei „PSAnrede = 2“ auf „Anrede = Frau“
gesetzt werden soll.
Diverse andere Felder sollen 1:1 übernommen werden.
Was muss ich machen, um das wie beschrieben zu realisieren?

Ich würde eher an eine View denken, als Daten zu duplizieren. Sonst wäre aber ein Trigger sinvoller, wenn die [PersoKurz] in Echtzeit aktualisiert werden soll, z. B. wenn ein neuer Datensatz oder eine Änderung an an der Haupttabelle erfolgt. Wenn das Ganze z. B. Nachts abgeglichen werden soll, wäre eine Stored Procedure das Richtige.

Bei einer View erstellst du keine Kopie, sondern nur eine andere Sicht auf die vorhandenen Daten. Synchronisationsprobleme werden somit umgangen.

Ich würde eher an eine View denken, als Daten zu duplizieren.
Sonst wäre aber ein Trigger sinvoller, wenn die [PersoKurz] in
Echtzeit aktualisiert werden soll, z. B. wenn ein neuer
Datensatz oder eine Änderung an an der Haupttabelle erfolgt.
Wenn das Ganze z. B. Nachts abgeglichen werden soll, wäre eine
Stored Procedure das Richtige.

Bei einer View erstellst du keine Kopie, sondern nur eine
andere Sicht auf die vorhandenen Daten.
Synchronisationsprobleme werden somit umgangen.

Hallo,

ich habe zuerst auch an einen View gedacht. Dann habe ich mir aber sagen lassen, dass ich in einem View keine „Datenkonvertierung“ durchführen kann. Oder geht das doch ? Wenn ja wie?

in der Tabelle
Personalstamm der Wert „PSAnrede = 1“ in der Tabelle PersoKurz
auf „Anrede = Herr“ und bei „PSAnrede = 2“ auf „Anrede = Frau“
gesetzt werden soll.

Hi,

sollte gehen:

CREATE OR REPLACE VIEW test (TST_PSANREDE ) AS
SELECT DECODE(PSANREDE ,‚1,‘‚Herr‘
,‚2‘,‚Frau‘
,‚Anrede nicht definiert‘)
FROM Personalstamm

Gruß

Hallo Andreas,

vielen Dank für den Tip. Leider kennt der SQL Query Analyzer von MS den Befehl DECODE nicht.

>>Server: Nachr.-Nr. 195, Schweregrad 15, Status 1, Zeile 4
>>‚DECODE‘ wird nicht als Funktionsname erkannt.

Gibt es noch andere Tips?
Benötige dringend Hilfe. Habe mir schon den Wolf gegoogled.

Danke
Heiko

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi,

leider kenn ich mich nicht mit MS-Sql aus, aber probier mal das hier

CREATE OR REPLACE VIEW test (TST_PSANREDE ) AS

SELECT ‚Herr‘
FROM Personalstamm
WHERE PSANREDE = ‚1‘
UNION ALL
SELECT ‚Frau‘
FROM Personalstamm
WHERE PSANREDE = ‚2‘
UNION ALL
SELECT ‚Anrede nicht definiert‘
FROM Personalstamm
WHERE PSANREDE NOT IN (‚1‘,‚2‘)

Nicht schön aber selten :o)

Gruß
Andreas

1 Like

Kennt SQL-Server die Case Syntax? Die ist meines Wissens SQL-Standard, was natürlich auch nicht viel heisst, selbst wenn es wahr ist …

Aber einen Blick in die Doku ist es Wert

Jens

Hallo,

so gehts mit SQLServer:

SELECT kategorie = CASE psanrede
 WHEN 1 THEN 'Herr'
 WHEN 2 THEN 'Frau'
 ELSE 'Nix'
 END
FROM personalstamm

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

CREATE OR REPLACE VIEW test (TST_PSANREDE ) AS

SELECT ‚Herr‘
FROM Personalstamm
WHERE PSANREDE = ‚1‘
UNION ALL
SELECT ‚Frau‘
FROM Personalstamm
WHERE PSANREDE = ‚2‘
UNION ALL
SELECT ‚Anrede nicht definiert‘
FROM Personalstamm
WHERE PSANREDE NOT IN (‚1‘,‚2‘)

Nicht schön aber selten :o)

Gruß
Andreas

Hallo Andreas,

vielen Dank. So klappt es und einen Schönheitswettbewerb wollte ich sowiso nicht gewinnen
:smile:

Noch mal recht herzlichen Dank an alle die mir helfen wollten und es auch getan haben.

Heiko