Announcement

Collapse
No announcement yet.

Trigger bei MS SQL

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • #16
    Sehr komisch.

    Wenn ich den Trigger so absetzte, wird der auch Created, allerdings führt der Server den DELETE an der eigentlichen Tabelle nicht mehr durch und der Trigger reagiert nicht.

    Comment


    • #17
      Hah, Problem erkannt und gebannt.

      Das Rote musste auch geändert werden.

      CREATE TRIGGER UpdateUserLoginStatusOffline ON dbo.CurrentUserDevices
      AFTER
      DELETE

      AS
      DECLARE @userId INT,
      @LoginTime DATETIME,
      @LoginStatus as INT

      BEGIN
      -- dieser Block wird nur erreicht wenn ein DELETE auf dem Feld datum erfolgt ist
      SELECT @userId = UserID FROM deleted
      SET @LoginTime = getdate()
      SET @LoginStatus = 0
      -- Insert in Tab 2
      INSERT INTO dbo.UserLoginStatus
      (UserId,UserLoginTime,LoginType) VALUES (@userId,@LoginTime,@LoginStatus)
      END

      Comment


      • #18
        Das hattest du doch oben schon!?!?!!?

        Noch ein hinweis: wenn du sicherstellen willst dass du SQL Scripte in deiner DB ausführen willst, probier mal

        USE [yourDB]

        Go

        ...

        so versuht er immer deine db zu benutzen und solche Fehler mit master etc. können nichtmehr auftreten !

        Comment


        • #19
          Danke für den Tipp!

          Ahja, eine Frage noch.

          Zwei Systemdatenbanken:

          DB1 und DB2

          Zwei Tabellen in DB1.TAB1 und DB2.TAB2

          Kann ich einen Trigger auf DB1.TAB1 setzen der Daten in DB2.TAB2 schreibt?

          Comment


          • #20
            Hallo daPanic,

            grundsätzlich kannst Du in jede DB schreiben, indem Du einen voll-qulifizierten Bezeichner angibst.

            INSERT INTO Datenbank1.Schema.Tabelle(Feld1)
            SELECT Feld1
            FROM Datenbank2.Schema.Tabelle

            Ob es auch im Trigger zulässig ist, weiss ich adhoc nicht, sollte aber gehen.
            Habe hier mehrere Trigger, die das über dynamisches SQL machen und da geht es jedenfalls.

            Olaf.
            Olaf Helper

            <Blog> <Xing>
            * cogito ergo sum * errare humanum est * quote erat demonstrandum *
            Wenn ich denke, ist das ein Fehler und das beweise ich täglich

            Comment


            • #21
              Gleich mal ausprobieren!

              Comment


              • #22
                Ausprobieren ergab leider nur keinen Erfolg.

                Wenn ich den folgenden Trigger einsetze:

                ALTER TRIGGER [dbo].[UpdateUserLoginStatusOffline] ON [dbo].[CurrentUserDevices]
                AFTER
                DELETE

                AS
                DECLARE @userId INT,
                @LoginTime DATETIME,
                @LoginStatus as INT,
                @LoginType as INT

                BEGIN


                SELECT @userId = UserID FROM deleted
                SET @LoginTime = getdate()
                SET @LoginStatus = 0
                SELECT @LoginType = DeviceType FROM deleted



                INSERT INTO DB2.dbo.UserLoginStatus
                (UserId,UserLoginTime,LoginType,LoginMedium)
                VALUES (@userId,@LoginTime,@LoginStatus,@LoginType)
                END


                ergibt sich folgende Auffälligkeit:

                Der DELETE auf die eigentliche Datenbank wird nicht mehr ausgeführt und der Trigger kommt gar nicht erst zum Einsatz.
                Gibt es eine Möglichkeit, den Verlauf des Statements zu verfolgen?

                Comment


                • #23
                  Ausgaben, in Form von

                  PRINT 'label 1'

                  Comment


                  • #24
                    und wo wird das dann ausgegeben? Wird das in die Logs geschrieben (weil ich da momentan nicht dran komme )

                    Comment


                    • #25
                      wenn du das im management studio aufrufst, wird es unten in dem Fehlermeldungsfenster (wie nennt man sowas gleich anders?) ausgegeben, ansonsten in der CommandLine.

                      In Logs kommt das ganz sicher auch aber es sollte auch angezeigt werden.

                      kannst dir auch Variablenbelegungen ausgeben lassen

                      PRINT @Art_nr

                      Comment


                      • #26
                        Ok, das stimmt.
                        Benutze ja das Studio und dann kommen Prints direkt bei MELDUNGEN raus.
                        Allerdings nur, wenn ich gerade einen Trigger anlege oder deratiges.

                        Nicht, wenn von irgendeiner anderen Quelle gerade ein Insert oder Delete abgesetzt wird und ich da keine Kontrolle drüber habe.




                        Hier mal der Unterschied:

                        INSERT TRIGGER, Funktioniert einwandfrei, Instert wird ausgeführt und der Trigger leistet seine Arbeit.

                        Code:
                        ALTER Trigger [dbo].[UpdateUserLoginStatusOnline] ON [dbo].[CurrentUserDevices]
                        AFTER 
                        INSERT
                        
                        
                        AS 
                        DECLARE @userId INT,
                        @LoginTime DATETIME,
                        @LoginStatus as INT,
                        @LoginType as INT
                        
                        BEGIN
                        
                        SELECT @userId = UserID FROM inserted
                        SET @LoginTime = getdate()
                        SET @LoginStatus = 1
                        SELECT @LoginType = DeviceType FROM inserted
                        
                        
                        INSERT INTO dbo.UserLoginStatus
                         (UserId,UserLoginTime,LoginType,LoginMedium) 
                        VALUES (@userId,@LoginTime,@LoginStatus,@LoginType) 
                        
                        
                        END



                        Der editierte Delete Trigger funktioniert nicht, auch das delete statement kommt nicht mehr zur ausführung, wenn dieser trigger angelegt ist:

                        Code:
                        ALTER TRIGGER [dbo].[UpdateUserLoginStatusOffline] ON [dbo].[CurrentUserDevices]
                        AFTER 
                        DELETE
                        
                        
                        AS 
                        DECLARE @userId INT,
                        @LoginTime DATETIME,
                        @LoginStatus as INT,
                        @LoginType as INT
                        
                        BEGIN
                        
                        SELECT @userId = UserID FROM deleted
                        SET @LoginTime = getdate()
                        SET @LoginStatus = 1
                        SELECT @LoginType = DeviceType FROM deleted
                        
                        
                        
                        INSERT INTO OTHERDB.dbo.UserLoginStatus (UserId,UserLoginTime,LoginType,LoginMedium)
                         VALUES (@userId,@LoginTime,@LoginStatus,@LoginType)
                        END

                        Comment


                        • #27
                          hast du die entsprechenden Rechte auf der anderen DB?

                          Comment


                          • #28
                            ja, ich bin auf beiden DBs als Owner angelegt

                            Comment


                            • #29
                              Guten Morgen,
                              ich hab immo nicht wirklich eine Ahnung warum das nicht geht. Probier mal folgende zwei Sachen:

                              1. (ich glaube das ist nicht unbedingt korrekt so aber versuchs mal)
                              mach mal das otherdb weg und benutze mal davor
                              USE Otherdb
                              oder
                              2. Schreib mal ne Prozedur in der anderen DB die die gleiche Aufgabe hat (das insert).

                              Dann sprich die Prozedur in deinem trigger an mit:
                              EXEC otherdb.procedure @var1 = @lala,....

                              vielleicht funktionierts, ansonsten bin ich ratlos da du syntaktisch keine Fehler gemacht hast!

                              Comment


                              • #30
                                Naja, nicht ganz.

                                Also du meinst eine Syntax wie folgende:

                                USE OtherDB
                                INSERT INTO [dbo].[UserLoginStatus] (UserId,UserLoginTime,LoginType,LoginMedium)
                                VALUES (@userId,@LoginTime,@LoginStatus,@LoginType)
                                END
                                Resultat:


                                Meldung 154, Ebene 15, Status 1, Prozedur UpdateUserLoginStatusOffline, Zeile 28
                                a USE database statement is not allowed in a procedure or trigger.

                                zu 2.:

                                Das hört sich vielleicht gut an: folgendes Problem....

                                Ich bekomme diese Fehlermeldung:

                                Cannot add rows to sysdepends for the current stored procedure because it depends on the missing object 'OtherDB.EXEC_BY_TRIGGER'. The stored procedure will still be created.


                                Wenn ich dieses EXEC

                                EXEC OTHERDB.EXEC_BY_TRIGGER @userId = @userId, @LoginStatus = @LoginStatus, @LoginType = @LoginType


                                Auf diese Procdure ausführen will:


                                set ANSI_NULLS ON
                                set QUOTED_IDENTIFIER ON
                                GO
                                -- =============================================
                                -- Author: <Author,,Name>
                                -- Create date: <Create Date,,>
                                -- Description: <Description,,>
                                -- =============================================
                                ALTER PROCEDURE [dbo].[EXEC_BY_TRIGGER]
                                -- Add the parameters for the stored procedure here


                                AS

                                declare @LoginTime DATETIME
                                SET @LoginTime = getdate()

                                declare @userId INT
                                declare @LoginStatus as INT
                                declare @LoginType as INT

                                BEGIN
                                -- SET NOCOUNT ON added to prevent extra result sets from
                                -- interfering with SELECT statements.
                                SET NOCOUNT ON;

                                -- Insert statements for procedure here
                                INSERT INTO [dbo].[UserLoginStatus] (UserId,UserLoginTime,LoginType,LoginMedium)
                                VALUES (@userId,@LoginTime,@LoginStatus,@LoginType)
                                END

                                Comment

                                Working...
                                X