none
BULKINSERT unter Agent geht nicht RRS feed

  • Frage

  • Hi,

    versuche einen TRUNCATE und einen BULKINSERT in eine Kunden-DB. Die SP steht unter einer Base-DB.

    Wenn ich die SP manuell starte, dannklappt alles. Unter einem Agent geht zwar der TRUNCATE, aber der BULKINSERT läuft nicht.

    BEGIN TRY
    	set @tableName = 't5003_focus_data'
    	set @dynSql = 'USE ' + @database_name + '; TRUNCATE TABLE ' + @database_name + '.dbo.' + @tableName
    	exec (@dynSql)
    	set @fileNameFull = @path + @file_name 
    	set @dynSql = 'USE ' + @database_name + '; BULK INSERT ' + @database_name + '.dbo.' + @tableName + ' FROM ''' + @fileNameFull
    	set @dynSql += ''' WITH (KEEPIDENTITY, FIRSTROW = 2, FIELDTERMINATOR = ''|'', ROWTERMINATOR = ''\n'')'
    	exec (@dynSql)
    	SET @rc = 0
    END TRY
    BEGIN CATCH
    	SET @rc = 1
    END CATCH
    return @rc

    @database_name ist die Kunde-DB.

    Benötigt der SQL-User evtl eine weitere besondere Berechtigung außer SELECT und EXECUTE für die MSDB? Z.B. für den Zugriff auf die Datei?


    Gruß Hipp


    • Bearbeitet Hipp1010 Donnerstag, 8. September 2016 12:33
    Donnerstag, 8. September 2016 12:31

Antworten

  • Hallo Hipp

    Das Dienstkonto des SQL Server Agent braucht mindestens Leserecht auf die Quelldatei im Dateisystem. Es liegt nicht an den Rechten innerhalb des  SQL Server sondern an den Rechten im Windows Dateisystem


    Benjamin Hoch
    MCSE: Data Platform
    MCSA: SQL Server 2012/2014
    MCSA: Windows Server 2012
    Blog

    • Als Antwort vorgeschlagen Benjamin.Hoch Donnerstag, 8. September 2016 16:55
    • Als Antwort markiert Hipp1010 Freitag, 9. September 2016 11:21
    Donnerstag, 8. September 2016 13:59
  • Hallo Benjamin,

    habs gelöst. Für das Ausführen des Agents (Job einstellen) benötigt der SQL-User die Role "sysadmin". UNd dann wie Du geschrieben hast, habe ich dem Subverzeichnis die entsprechenden Zugriffsrechte gegeben.

    Merci.


    Gruß Hipp

    Hallo

    ich muss Benjamin da Recht geben. Sysadmin "braucht" man eigentlich wirklich nur in Ausnahmefällen als Admin oder Server-Analyst.

    Um einen Job auszuführen muss man lediglich Besitzer des Jobs sein, und Mitglied der msdb-Rolle "SQLAgentUserRole"Gruß

    der Andreas


    Andreas Wolter (Blog | Twitter)
    MCSM: Microsoft Certified Solutions Master Data Platform/SQL Server 2012
    MCM SQL Server 2008
    MVP Data Platform
    www.SarpedonQualityLab.com | www.andreas-wolter.com

    • Als Antwort vorgeschlagen Dirk Hondong Freitag, 9. September 2016 08:48
    • Als Antwort markiert Hipp1010 Freitag, 9. September 2016 08:54
    • Tag als Antwort aufgehoben Hipp1010 Freitag, 9. September 2016 09:49
    • Als Antwort markiert Hipp1010 Freitag, 9. September 2016 11:20
    Donnerstag, 8. September 2016 19:05
  • Hallo Hipp,

    gibt es den eine Fehlermeldung im Job Verlauf, die hilfreich wäre? Siehe BULK INSERT (Transact-SQL) => Sicherheit; ich schätze mal, es wird eher an den Zugriffsrechten auf die Quelldatei liegen, das die nicht gelesen werden kann.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort vorgeschlagen Benjamin.Hoch Donnerstag, 8. September 2016 14:11
    • Als Antwort markiert Hipp1010 Freitag, 9. September 2016 11:21
    Donnerstag, 8. September 2016 13:21

Alle Antworten

  • Hallo Hipp,

    gibt es den eine Fehlermeldung im Job Verlauf, die hilfreich wäre? Siehe BULK INSERT (Transact-SQL) => Sicherheit; ich schätze mal, es wird eher an den Zugriffsrechten auf die Quelldatei liegen, das die nicht gelesen werden kann.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort vorgeschlagen Benjamin.Hoch Donnerstag, 8. September 2016 14:11
    • Als Antwort markiert Hipp1010 Freitag, 9. September 2016 11:21
    Donnerstag, 8. September 2016 13:21
  • Hallo Olaf,

    hier die Meldung:

    Cannot bulk load because the file "D:\Export_Data.tab" could not be opened. Operating system error code 5(Access is denied.).

    Es handelt sich um eine SP, die einen Agent anlegt, der in einem Step eine SP startet, die eben den TRUNCATE und danach den BULKINSERT machen soll. Dies erfogt beim Webservice über einen SQL-User.

    User ist in Server-Role "bulkadmin", "public".


    Gruß Hipp


    • Bearbeitet Hipp1010 Donnerstag, 8. September 2016 13:34
    Donnerstag, 8. September 2016 13:33
  • Hallo Hipp

    Das Dienstkonto des SQL Server Agent braucht mindestens Leserecht auf die Quelldatei im Dateisystem. Es liegt nicht an den Rechten innerhalb des  SQL Server sondern an den Rechten im Windows Dateisystem


    Benjamin Hoch
    MCSE: Data Platform
    MCSA: SQL Server 2012/2014
    MCSA: Windows Server 2012
    Blog

    • Als Antwort vorgeschlagen Benjamin.Hoch Donnerstag, 8. September 2016 16:55
    • Als Antwort markiert Hipp1010 Freitag, 9. September 2016 11:21
    Donnerstag, 8. September 2016 13:59
  • Hallo Benjamin,

    habs gelöst. Für das Ausführen des Agents (Job einstellen) benötigt der SQL-User die Role "sysadmin". UNd dann wie Du geschrieben hast, habe ich dem Subverzeichnis die entsprechenden Zugriffsrechte gegeben.

    Merci.


    Gruß Hipp

    • Als Antwort markiert Hipp1010 Donnerstag, 8. September 2016 14:10
    • Tag als Antwort aufgehoben Hipp1010 Freitag, 9. September 2016 11:20
    Donnerstag, 8. September 2016 14:10
  • Hallo Hipp,

    einem User die Rolle Sysadmin zu geben ist nicht die Lösung. Wenn dein Problem mit dem Sysadmin geht dann fehlen dem User im SQL Server noch Rechte.

    Das kann man vergleichen als wenn man einem Nutzer Domänen-Admin Rechte gibt weil er eine Datei kopieren will. Suche besser noch die fehlenden Rechte und nutze die Sysadmin Rolle nur für den (einen) Administrator welcher das System betreut.

    Gruß Benjamin


    Benjamin Hoch
    MCSE: Data Platform
    MCSA: SQL Server 2012/2014
    MCSA: Windows Server 2012
    Blog

    • Als Antwort markiert Hipp1010 Freitag, 9. September 2016 11:20
    • Tag als Antwort aufgehoben Hipp1010 Freitag, 9. September 2016 11:21
    Donnerstag, 8. September 2016 16:55
  • Hallo Benjamin,

    habs gelöst. Für das Ausführen des Agents (Job einstellen) benötigt der SQL-User die Role "sysadmin". UNd dann wie Du geschrieben hast, habe ich dem Subverzeichnis die entsprechenden Zugriffsrechte gegeben.

    Merci.


    Gruß Hipp

    Hallo

    ich muss Benjamin da Recht geben. Sysadmin "braucht" man eigentlich wirklich nur in Ausnahmefällen als Admin oder Server-Analyst.

    Um einen Job auszuführen muss man lediglich Besitzer des Jobs sein, und Mitglied der msdb-Rolle "SQLAgentUserRole"Gruß

    der Andreas


    Andreas Wolter (Blog | Twitter)
    MCSM: Microsoft Certified Solutions Master Data Platform/SQL Server 2012
    MCM SQL Server 2008
    MVP Data Platform
    www.SarpedonQualityLab.com | www.andreas-wolter.com

    • Als Antwort vorgeschlagen Dirk Hondong Freitag, 9. September 2016 08:48
    • Als Antwort markiert Hipp1010 Freitag, 9. September 2016 08:54
    • Tag als Antwort aufgehoben Hipp1010 Freitag, 9. September 2016 09:49
    • Als Antwort markiert Hipp1010 Freitag, 9. September 2016 11:20
    Donnerstag, 8. September 2016 19:05
  • Hallo,

    vielen Dank. Werde dies dahingehend prüfen und ändern.


    Gruß Hipp

    Freitag, 9. September 2016 08:54
  • Hallo,

    danke. Hat alles funktioniert.


    Gruß Hipp

    Freitag, 9. September 2016 10:20
  • Hallo Hipp,

    es sollte eigentlich so sein, dass man die Posts als Antwort markiert welche Teil der Lösung sind. Den eigenen Post als Antwort zu markieren sollte man nur wenn man wirklich alleine auf die Lösung gekommen ist und diese als Lösung kennzeichnen will.

    In diesem Fall wären also die Posts von Olaf, Andreas und mir Teil der Antwort.

    Gruß Benjamin


    Benjamin Hoch
    MCSE: Data Platform
    MCSA: SQL Server 2012/2014
    MCSA: Windows Server 2012
    Blog

    Freitag, 9. September 2016 10:55
  • Hallo,

    natürlich. Habe vergessen das herauszunehmen. Habs korrigiert und Danke an alle.


    Gruß Hipp

    Freitag, 9. September 2016 11:23