btotherunner
Goto Top

MSSQL Trigger neue Inserts aus Sicht sollen automatisch in eine Tabelle geschrieben werden

Hallo ich schläge mich gerade mit folgendem Problem rum.

ich habe eine Sicht "View_ZeiterfassungKomplettGrunddaten" in dieser werden aus mehreren Tabellen Daten zusammengeführt und dargestellt.
desweiteren existiert eine Tabelle "dbo.ZeiterfassungKomplett" mit gleichen Spalten wie die View + Extra spalten (STATUS1, STATUS2, STATUS3 etc..).

Hintergrund:
In der Sicht werden die Daten aus verschiedenen Tabellen zusammengeführt und angezeigt, diese Sicht wird initial einmal in die Tabelle "ZeiterfassungKomplett" eingetragen, damit man jetzt verschiedene extra Felder wie (Status1) editieren kann.
Ein Trigger soll nun alle neu hinzukommenden Einträge aus der Sicht in die Tabelle eintragen.


Leider funktioniert mein Trigger nicht... jemand eine IDEE?

USE [Database1]
GO
/****** Object:  Trigger [dbo].[trCopyData]    Script Date: 04/12/2011 10:39:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		Markus Brunner
-- Create date: 12. April 2011
-- Description:	Automatischer Abgleich der neuen Datensätze aus der View in die Tabelle dbo.UKMCZeiterfassungKomplett
-- =============================================
CREATE TRIGGER [dbo].[trCopyData] 
   ON  [dbo].[View_ZeiterfassungKomplettGrunddaten]
   INSTEAD OF INSERT
AS
	INSERT INTO dbo.ZeiterfassungKomplett
	(MaNr, NAME, VORNAME, Datum, Kommen, Gehen, Pause, Kommentar, Wert1, Wert2, StartZuHause, EndeZuHause, PrivatPKW, km, KommenSort, DatumSort, Einsatzort, HNummer)
	SELECT MaNr, NAME, VORNAME, Datum, Kommen, Gehen, Pause, Kommentar, Wert1, Wert2, StartZuHause, EndeZuHause, PrivatPKW, km, KommenSort, DatumSort, Einsatzort, HNummer FROM inserted
GO

Content-ID: 164403

Url: https://administrator.de/contentid/164403

Ausgedruckt am: 22.11.2024 um 06:11 Uhr

SlainteMhath
SlainteMhath 12.04.2011 um 11:21:23 Uhr
Goto Top
Moin,

die Frage die sich mir stellt:
schreibst Du

a) direkt in den View also
INSERT INTO View_ZeiterfassungKomplettGrunddaten ...
oder machst Du
b) inserts/updates auf die dem View zu grundliegenden Tabellen?

Im Fall a); Gehen INSERT auf Views? Hab MSSQL schon lang nicht mehr in der Handgehabt.
Im Fall b); Da brauchst Du dann Trigger auf die einzelnen Tabellen.

lg,
Slainte
btotherunner
btotherunner 12.04.2011 um 11:24:54 Uhr
Goto Top
also aus der view soll wirklich nur ausgelesen werden, die werte aus die die view Ihre Daten bezieht sollen unangepasst bleiben.

Das einzige was passieren soll sind, alle neuen Einträge die mit dem Befehl INSERT erstellt werden automatisch auch in die Tablle zu plazieren.

lg
Markus

a) ich mache keine INSERT auf einen VIEW sondern auf eine TABELLE
b) versteh eich nciht ^^
SlainteMhath
SlainteMhath 12.04.2011 um 11:36:14 Uhr
Goto Top
a) ich mache keine INSERT auf einen VIEW sondern auf eine TABELLE
b) versteh eich nciht ^^
Der Trigger muss für die Tabelle angelegt werden, die im INSERT angesprochen wird, nicht auf einen View (der bekommt davon nix mit)
Übrigens: mit "INSTEAD OF INSERT" werden die neuen Records nicht in die übprüngliche Tabelle geschrieben.
btotherunner
btotherunner 12.04.2011 um 11:40:39 Uhr
Goto Top
Kannst du mir anhand eines Bsp. zeigen was du meinst.

Ich habe es so verstanden:

Mein Trigger von oben muss nicht in der View als Trigger erstellt werden, sondern in der Tabelle in der die Daten reinkopiert werden.

Stimmt denn mein Trigger ansonsten?

lg
Markus
SlainteMhath
SlainteMhath 12.04.2011 um 11:48:12 Uhr
Goto Top
Bespiel:
Du machst ein "INSERT INTO TabelleA values(...)" und nöchstest

a) das die Daten in TabelleA UND TabelleB stehen:
CREATE TRIGGER [dbo].[trCopyData]
ON [dbo].[TabelleA]
FOR INSERT
AS
INSERT INTO TabelleB .... SELECT FROM .... inserted

b) das die Daten NUR in TabelleB stehen
CREATE TRIGGER [dbo].[trCopyData]
ON [dbo].[TabelleA]
INSTEAD OF INSERT
AS
INSERT INTO TabelleB .... SELECT FROM .... inserted

Jetzt klarer?

Im Detail hier nachzulesen.
btotherunner
btotherunner 12.04.2011 um 12:03:46 Uhr
Goto Top
Eine Frage habe ich trozdem noch face-smile

D.h. wenn ich jetzt aus der View die neuen Einträge in meiner Tabelle haben muss, gehe ich folgt vor:
Die original Daten sollen natürlich nicht angefasst/verändert o. gelöscht werden.

1. Gehe in die Tabelle (nicht in die View) um dort den Trigger zu erstellen.
2. In den Trigger trage ich
CREATE TRIGGER [dbo].[trCopyData] 
ON [dbo].[view_Sicht] 
FOR INSERT 
AS 
INSERT INTO richtige_tabelle .... SELECT FROM .... inserted
3. Speichern und hoffen dass es funktioniert face-smile
SlainteMhath
SlainteMhath 12.04.2011 um 12:31:21 Uhr
Goto Top
Zitat von @btotherunner:
Soweit alles richtig, bis auf

ON [dbo].[view_Sicht]

TABELLE, nicht SICHT!! face-smile