Announcement

Collapse
No announcement yet.

Trigger unter anderer Anmeldung ausführen

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

  • Trigger unter anderer Anmeldung ausführen

    Hallo zusammen,

    ich habe ein kleines Problem. Wir haben zwei MS SQL DBs. In beiden DBs haben User unterschiedliche Rechte. Keiner der User von DB "1" hat Zugriff auf DB "2", andersrum genauso (Ausser der ADMIN natürlich). Um Jetzt Daten abzugleichen, haben wir in DB "1" einen Trigger, der eine Tabelle in DB "2" füllt. Dies funktioniert mit meiner ADMIN Anmeldung einwandfrei und auch die User in DB "2" können ihre Tabelle lesen. Es kann nur kein normaler User aus DB "1" diesen Trigger ausführen, da er nicht das Recht hat in DB "2" zu schreiben.

    Kann man einen Trigger irgendwie als SA oder ein sonstiger USER ausführen?

    Zur Info noch, wir benuzten die Windows Anmeldung.

    Ich würde mich sehr über Hilfe freuen.


    Vielen Dank schon mal

    Ronny Treutler

  • #2
    Hallo Ronny, suche mal in der Hilfe nach SETUSER! Dies geht allerdings nur, wenn man die Rechte als DBOWNER oder SYSADMIN hat!
    Aber mir scheint Du solltest besser eine Snapshot- oder MergeReplikation benutzen! Ist einfacher und du könntest Dich mit dem SQL-Server-Agent beliebig anmelden!

    Gruß
    Thomas Rith

    Comment


    • #3
      Hallo und erstmal vielen Dank für die schnelle Hilfe.

      Also das Mergen ist hier leider nicht gewollt. Das war auch eine meiner Ideen. Die Snapshots denke ich werden sich verhalten wie Views. Das hatte ich auch mal probiert, da fehlte dann aber dem "B" User das Recht in DB "A" lesen zu dürfen.

      Also Setuser

      Ich habe hier mal mein Bsp. gepostet, da es auch nicht fubktioniert. Er sagt immer noch das er nicht das Recht hat zu schreiben. Evtl. siehst Du ja gleich, Mensch das Setuser muss doch da hin oder so.


      CREATE TRIGGER [Wareneingaenge_fuellen] ON [TEST_A].[dbo].[TEST A$Item Ledger Entry]
      After INSERT
      AS

      setuser 'dbo'

      declare @EntryNo int
      declare @PostingDate datetime
      declare @ItemNo varchar(20)
      declare @Quantity decimal(38,20)
      declare @EntryType int

      select @EntryNo = [Entry No_] FROM INSERTED
      select @PostingDate = [Posting Date] FROM INSERTED
      select @ItemNo = [Item No_] FROM INSERTED
      select @Quantity = [Quantity] FROM INSERTED
      select @EntryType = [Entry Type] FROM INSERTED

      -- Entry Type 0 = Einkauf, 4 = Umlagerung
      IF ((@EntryType = 0) OR (@EntryType = 4)) AND (@Quantity > 0) BEGIN

      INSERT INTO [TEST_B].[dbo].[TEST B$Item Ledger Entry NL]([Entry No_], [Posting Date], [Item No_], [Quantity], [Entry Type])
      VALUES(@EntryNo, @PostingDate, @ItemNo, @Quantity, @EntryType)

      END

      lg Ronny

      Comment


      • #4
        Hallo Ronny,

        Also erstmal würde ich den Insertbefehl umschreiben:

        INSERT INTO [TEST_B].[dbo].[TEST B$Item Ledger Entry NL]([Entry No_], [Posting Date], [Item No_], [Quantity], [Entry Type])
        select [Entry No_],
        [Posting Date],
        [Item No_],
        [Quantity],
        [Entry Type]
        FROM INSERTED
        Where (([Entry Type] = 0) OR ([Entry Type] = 4)) AND (Quantity > 0) -- Entry Type 0 = Einkauf, 4 = Umlagerung

        Geht Schneller und vor allen Dingen läufst Du mit Deiner Variante Gefahr, das es knallt! Denn wenn Du mehr als einen Datensatz einfügst, oder etwa keinen Datensatz dann gibt es Fehlermeldungen...!

        Und zu dem Userproblem: Erteile den Nutzern doch einfach das Recht, in die Tabelle zu schreiben. Dann bist Du das Problem los

        Gruß
        Thomas

        Comment


        • #5
          Hallo Thomas,

          das Problem ist wir haben hier eine Software im Einsatz, die jedesmal wieder diese Rechte entzieht. Es muss deshalb irgendwas dauerhaftes her.
          Das andere mit dem INSERT werde ich mal ausprobieren.

          Eine View würde mir ja auch helfen, aber dadurch hab ich dann das Problem auf der anderen Seite.

          Gruss

          Ronny

          Comment


          • #6
            Hallo Ronny,

            die Software muss sich ja auch anmelden... irgendwie... und diesem Account entziehst Du das Recht, Rechte zu setzen oder zu entfernen Sorry aber mehr fällt mir im Augenblick nicht dazu ein. Ihr müsst doch irgendwie die Möglichkeit haben, die Rechte einstellen zu können.... Wenn nicht würde ich mit dem Softwareanbieter mal sprechen...

            Gruß
            Thomas

            Comment


            • #7
              Ja also, der eine Mandant hat eine DB und der andere auch. Und die Vorraussetzung ist, das keiner Zugriff auf die andere DB hat. Wuerde ich es jetzt einem User geben, dann koennte er sich auch da anmelden und zumindest diese Tabelle editieren. Deswegen muss, wie auch immer, ein Adminuser oder so dies übernehmen.

              lg Ronny

              Comment


              • #8
                Hallo Ronny,

                dann bleibt, glaube ich nur noch, das Du einen Job einrichtest, der z.B. jede viertel-Stunde läuft und Dir die Tabellen abgleicht... Der Trigger könnte die Datensätze in einer Tabelle zwischenspeichern und der Job (Agent) arbeitet dies dann ab und transferiert die Daten zwischen den beiden Datenbanken.

                Gruß
                Thomas

                Comment


                • #9
                  Hallo Thomas,
                  auch diese Variante hatte ich unserem Kunden vorgeschlagen, aber er wollte nicht noch einen Job laufen lassen, den er evtl. mal überwachen muss. Ich konnte ihn aber jetzt davon überzeugen, einen DB Benutzer anzulegen, der in beide DBs schreiben darf und damit geht es nun. Die Hauptarbeit am Projekt waren nun letztendlich die Diskussionen und nicht das Schreiben des Quelltextes.

                  Vielen Dank für die Hilfe

                  lg

                  Ronny



                  PS: Das Forum kann man weiterempfehlen

                  Comment

                  Working...
                  X