none
Trigger auf einen View (MS-SQL2008R2) RRS feed

  • Frage

  • Hallo,

    ich habe einen View erstellt und möchte darauf einen Insert-Trigger darauf setzen, der mir einen weiteren View erstellt. Leider komme ich damit überhaupt nicht klar. Was ist an dem Code falsch?

    CREATE TRIGGER TestTrigger ON [dbo].[Projektstand]
    after INSERT as

    BEGIN
        SET NOCOUNT ON


    -- View löschen fals vorhanden
    IF  EXISTS (SELECT * FROM sys.views
     WHERE object_id = OBJECT_ID(N'[dbo].[TESTVIEW]'))
    DROP VIEW  [dbo].[TESTVIEW]
    GO

    -- view neu erstellen undbefüllen

    create view Testview as
    SELECT [Name]
          ,[Unternehmensbereich]
          ,[Kurztext]
          ,[Kurzname]
          ,[Name2]
          ,[Straße]
          ,[PLZ]
          ,[Ort]
          ,[Kostenstelle]
          ,[Status]
          ,[Nachkalkulation]
          ,cast ([Angebotssumme] AS float) as Angebotssumme
          ,cast ([Auftragssumme] AS float) as Auftragssumme
          ,cast ([Forderungen] AS float) as Forderungen
          ,cast ([Zahlungen] as Float) as Zahlungen
          ,cast ([Restbetrag] as Float) as Restbetrag
          ,Cast(Rechnungsdatum as Float)as Rechnungsdatum
          ,Cast([Nettoforderungen] as Float)as Nettoforderungen
          ,Cast([Gesamtkosten] as Float)as Gesamtkosten
          ,Cast([Gewinn] as Float)as Gewinn
          ,Cast([Gewinnanteil] as Float)as Gewinnanteil
          ,Cast([Ertrag] as Float)as Ertrag
          ,round([DB1hIst],2)as DB1
          ,[Eigentümer],
          Cast([Änderungsdatum] as date)as [Änderungsdatum]
          ,[Bearbeiter]
      FROM [Wellmann].[dbo].[Projektstand]
    GO

    Jeder einzelne Part, das Löschen des View und das neu erstellen funktionieren für sich selbst.

    Wäre nett wenn mir jemand helfen kann

    Mittwoch, 29. Mai 2013 12:16

Antworten

  • Hi,

    Du willst bei jedem INSERT eine neue View erstellen? Das meinst Du hoffentlich nicht ernst.

    Um dir zu sagen, was falsch ist (außer, dass Du das überhaupt machen willst) müsstest Du uns schon verraten, welche Fehlermeldung Du erhältst.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 29. Mai 2013 12:21
    Moderator

Alle Antworten

  • Hi,

    Du willst bei jedem INSERT eine neue View erstellen? Das meinst Du hoffentlich nicht ernst.

    Um dir zu sagen, was falsch ist (außer, dass Du das überhaupt machen willst) müsstest Du uns schon verraten, welche Fehlermeldung Du erhältst.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 29. Mai 2013 12:21
    Moderator
  • Hi,

    Also, ich will den zweiten View erstellen nachdem der erste komplett gefüllt wurde.

    Die Fehlermeldung die ich erhalte lautet:
    "Meldung 102, Ebene 15, Status 1, Prozedur TestTrigger, Zeile 19
    Falsche Syntax in der Nähe von 'TESTVIEW'."

    Mittwoch, 29. Mai 2013 12:27
  • Hallo,

    manche DDL Statements müssen zwingend das erste Statement in einem Batch sein, CREATE VIEW gehört dazu. Das ist also so schon mal nicht möglich.

    Einfaches Beispiel zum Austesten

    CREATE PROCEDURE dbo.TestAussen
    AS
       CREATE VIEW dbo.TestInnen AS 
           SELECT 'Hello World' AS Result

    Liefert bereits beim Parsen die gleiche Fehlermeldung.


    Olaf Helper

    Blog Xing

    Mittwoch, 29. Mai 2013 12:34
  • Hi,

    glaub mir, Du willst in einem INSERT Trigger keine neue View erstellen. Welchen Sinn soll das auch haben?

    Wenn Du das dennoch machen willst, musst Du das CREATE VIEW Statement wohl in eine nvarchar Variable packen und dieses dynamische Statement per EXEC ausführen. Schau dir hierfür aber mal das hier an:

      http://www.insidesql.org/blogs/frankkalis/2004/07/16/dynamisches-sql-fluch-und-segen


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 29. Mai 2013 12:34
    Moderator
  • Der Ansatz ist schon falsch.
    Eine View ist nur ein abgespeichertes Statement und enthält in der Regel keine Daten. Damit bietet sie immer den Blick auf die aktuellen Daten, ohne dass hier etwas aktualisiert werden müsste.

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    http://www.insidesql.org/blogs/cmu/

    Mittwoch, 29. Mai 2013 12:38
  • Hallo,

    ich denke Du hast ein falsches Verständnis davon, was Sichten sind.

    Die stellen - der Name ist Programm - eine Sicht auf eine (oder mehrere) Tabelle(n) dar. Sie bilden dabei die Daten der zugrunde liegenden Tabelle(n) ab. Ändert sich der Inhalt der Tabelle so sieht man dies auch in der Sicht.

    Es gibt also keinen Grund beim Ändern des Datenbestandes eine Sicht (neu) zu erstellen.

    Der Syntaxfehler ist wiederum nur eine Randerscheinung: Sichten dürfte nur als einzige Anweisung in einem Stapel verendet werden. In einem Trigger geht das deswegen schon mal gar nicht ohne Umwege.

    Gruß Elmar

    Mittwoch, 29. Mai 2013 12:39
    Beantworter
  • Ja, ich kann nun auch erkennen das mein Ansatz nicht richtig ist.

    Allerdings fülle ich den ersten View mit einem sehr aufwändigen Statement um dann mit dem View im SharePoint arbeiten zu können.

    Beim erstellen des ersten Views sollen dann eine Reihe weiterer Views erstellt werden. Das ist eigentlich die Aufgabe die ich zu lösen versuche.

    Gruß

    Heiko

    Mittwoch, 29. Mai 2013 12:43
  • Erstelle die Sichten einmalig alle gemeinsam vorher. Mehr ist nicht zu tun.

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    http://www.insidesql.org/blogs/cmu/

    Mittwoch, 29. Mai 2013 12:47
  • Hallo Heiko,

    evtl. solltest Du dir wirklich erst einmal klar darüber werden, was eine View überhaupt ist.

    Eine View wird nicht gefüllt, eine View liefert lediglich Daten aus den der View zugrundeliegenden Tabellen/Datenquellen in einer bestimmten Form. D.h. die View selbst beinhaltet überhaupt keine Daten.

    Warum Du beim Erstellen einer View weitere Views erzeugen willst, verstehe ich nicht. Die Views kann man im Vorfeld erstellen und damit hat sich das dann.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 29. Mai 2013 12:49
    Moderator
  • Danke an alle! Ich habe da wohl das Brett vorm Kopf nicht gesehen...
    Mittwoch, 29. Mai 2013 13:04
  • Hallo mxyptlk,

    Wenn Dir die Antworten geholfen haben, dann bitte markiere diese als Antwort.

    Danke und Gruss,

    Ionut

    Freitag, 31. Mai 2013 12:36
    Moderator