none
Stored Procedure mit einem anderen User ausführen

    Frage

  • Hallo zusammen

    Ich habe ein Stored procedure den ich testen möchte.

    Gerne möchte ich diese SP mit einem anderen User testen. WEnn ich die SP als dbo.owner (mein Acc) teste klappt alles. Nun möchte ich gerne wissen ob der technische User der angelegt worden ist die SP auch ausführen kann. Wie kann ich dies bewältigen? Sitze schon eine Weile an dem.

    Ich habe ein paar Artikel über den Exec as Klausel gelesen, hat mich aber nicht zum Ziel geführt.

    Ausserdem ist Ende SP ein cmdshell befehlt wo die Auswertung in ein TXT file im Netzwerk generiert. Der Technische User muss natürlich beim Pfad wo der cmdshell das text File generiert auch berechtigt sein. Dies ist er.

    Ich wäre wirklich sehr dankbar wenn ich ein paar Ideen von euch hätte

    Beste Grüsse

    Mehmet



    • Bearbeitet Mehmet.B Montag, 14. Januar 2013 13:21
    Montag, 14. Januar 2013 13:20

Antworten

Alle Antworten

  • Hallo Mehmet,

    Mit EXECUTE AS (Transact-SQL) bzw. mit SETUSER (Transact-SQL) solltest Du aber den gewünschten Context Switch hin bekommen, um unter einem anderen User testen zu können; vorausgesetzt Du hast auch die Berechtigungen dazu.

    Siehe auch Context Switching (Database Engine)


    Olaf Helper

    Blog Xing

    Montag, 14. Januar 2013 13:30
  • Hallo Mehmet,

    in SSMS eine neue Abfrage...

    USE DeineDB;
    GO
    
    EXECUTE AS Login = 'DeinAndererUser'
    
    EXEC dbo.DeineProcedure
    
    REVERT;
    GO


    Uwe Ricken

    MCITP Database Administrator 2005
    MCITP Database Administrator 2008
    MCITP Microsoft SQL Server 2008, Database Development

    db Berater GmbH
    http://www-db-berater.de
    SQL Server Blog (german only)

    Montag, 14. Januar 2013 14:14
  • Ausserdem ist Ende SP ein cmdshell befehlt wo die Auswertung in ein TXT file im Netzwerk generiert. Der Technische User muss natürlich beim Pfad wo der cmdshell das text File generiert auch berechtigt sein. Dies ist er.


    Was meinst Du mit "technischer User". xp_cmdshell wird immer im Context des Serviceaccounts für die SQL Engine ausgeführt!
    Also muss das Servicekonto des SQL Servers diese Berechtigungen haben.

    ABER...

    Dein Account benötigt die Berechtigungen zum Ausführen von xp_cmdshell! Das ist ein Sicherheitsproblem. Eventuell sollest Du darüber nachdenken, die Prozedur mittels Zertifikat auszuführen.

    Ein anderes - nicht zu unterschätzendes - Risiko ist die Tatsache, dass xp_cmdshell IMMER synchon ausgeführt wird. Wenn also xp_cmdshell auf eine Eingabe wartet, wartet Deine gesamte Prozedur. Wenn es nur um ETL geht, überlege Dir, es besser mit einem SSIS-Paket zu machen.

    Ein Beispiel für die Verwendung von Zertifikaten:
    http://db-berater.blogspot.de/2012/11/zertifikate-fur-die-ausfuhrung-von.html

    xp_cmdshell: http://msdn.microsoft.com/de-de/library/ms175046.aspx

    Alternativen zu xp_cmdshell: http://technet.microsoft.com/en-us/library/cc917564.aspx


    Uwe Ricken

    MCITP Database Administrator 2005
    MCITP Database Administrator 2008
    MCITP Microsoft SQL Server 2008, Database Development

    db Berater GmbH
    http://www-db-berater.de
    SQL Server Blog (german only)


    Montag, 14. Januar 2013 14:21
  • Hallo Mehmet,

    in SSMS eine neue Abfrage...

    USE DeineDB;
    GO
    
    EXECUTE AS Login = 'DeinAndererUser'
    
    EXEC dbo.DeineProcedure
    
    REVERT;
    GO


    Uwe Ricken

    MCITP Database Administrator 2005
    MCITP Database Administrator 2008
    MCITP Microsoft SQL Server 2008, Database Development

    db Berater GmbH
    http://www-db-berater.de
    SQL Server Blog (german only)

    Hallo Uwe

    Besten Dank für die Query... Hat geklappt. Konnte das Skript mit dem zweiten User ausführen.

    Montag, 14. Januar 2013 15:55
  • Hallo Mehmet,

    Mit EXECUTE AS (Transact-SQL) bzw. mit SETUSER (Transact-SQL) solltest Du aber den gewünschten Context Switch hin bekommen, um unter einem anderen User testen zu können; vorausgesetzt Du hast auch die Berechtigungen dazu.

    Siehe auch Context Switching (Database Engine)


    Olaf Helper

    Blog Xing

    Hallo Ofaf

    Besten Dank für die Links, werde mich mal genauer mit den Links auseinander setzten. Wo ich noch Probleme hatte ist, den "Revert" Befehl vergessen habe.

    Montag, 14. Januar 2013 15:56
  • Hallo Mehmet,

    in SSMS eine neue Abfrage...

    USE DeineDB;
    GO
    
    EXECUTE AS Login = 'DeinAndererUser'
    
    EXEC dbo.DeineProcedure
    
    REVERT;
    GO


    Uwe Ricken

    MCITP Database Administrator 2005
    MCITP Database Administrator 2008
    MCITP Microsoft SQL Server 2008, Database Development

    db Berater GmbH
    http://www-db-berater.de
    SQL Server Blog (german only)

    Hallo Uwe

    Frage, kann ein sp_XXX welcher durch User 1 abgefeuert worden ist dann in der sp_XXX einen Teil der sp_XXX durch einen zweiten User 2 weitergeführt werden?

    Grüsse

    Mehmet

    Montag, 28. Januar 2013 12:41
  • Hallo Mehment,

    ja - das kann man machen, indem man die Prozedur selbst mit EXECUTE AS programmiert.

    Siehe Details hierzu: http://msdn.microsoft.com/de-de/library/ms188354.aspx


    Uwe Ricken

    MCSE - SQL Server 2012
    MCSA - SQL Server 2012
    MCITP Database Administrator 2005
    MCITP Database Administrator 2008
    MCITP Microsoft SQL Server 2008, Database Development

    db Berater GmbH
    http://www-db-berater.de
    SQL Server Blog (german only)

    Montag, 28. Januar 2013 13:17
  • Hi Uwe

    gerne würde ich das machen aber kriege immer wieder den Fehler:

    An error occurred during the execution of xp_cmdshell. A call to 'LogonUserW' failed with error code: '1326'.

    Montag, 28. Januar 2013 13:44
  • Hallo Mehmet,

    das ist klar, wenn der Benutzer, den Du angegeben hast, nicht berechtigt ist, xp_cmdshell auszuführen.
    Ich würde das ganze auch nicht mit einem User sondern mit einem Zertifikat machen.

    Ich habe dazu mal einen Blogeintrag (Anleitung) geschrieben.

    http://db-berater.blogspot.de/2012/11/zertifikate-fur-die-ausfuhrung-von.html


    Uwe Ricken

    MCSE - SQL Server 2012
    MCSA - SQL Server 2012
    MCITP Database Administrator 2005
    MCITP Database Administrator 2008
    MCITP Microsoft SQL Server 2008, Database Development

    db Berater GmbH
    http://www-db-berater.de
    SQL Server Blog (german only)

    Montag, 28. Januar 2013 14:00
  • Hi Uwe Ne, der User ist auch der Proxy account und Sys admin. Das ist eigentlich nicht das Problem. Was ich feststellen musste ist, dass der User welche die SP_XXX ausführt nicht den 'Execute as' verwenden kann da er nur ein public User ist welcher auch nur Exec Berechtigung für die SP_XXX besitzt. WEnn ich dem User die sysadmin rechte gebe klappt es. Msg 15406, Level 16, State 1, XXXXXXXXXXXXXX, Line 41 Cannot execute as the server principal because the principal "XXXXX\XXXXXXX" does not exist, this type of principal cannot be impersonated, or you do not have permission. Kann dass sein, das der public user gar nicht dies so ausführen kann? Ansonsten werde ich heute mal an deinem Blog Zeit schenken und dies mit einem Zertifikat ausfürhen. Zur Info noch: Die SP hat am Ende einen xp_cmd_Shell welche er noch ausführen soll.
    Montag, 28. Januar 2013 16:34