Nur noch schnell einen BULK INSERT von einem Share …

Wer kennt das nicht? Noch schnell die Daten von einem Share in einen SQL Server laden und fertig. Der SQL Server Dienst läuft aber in der Regel unter einem lokalen Account (Local System, Local Service oder  Network Service). Dieser hat naturgemäß keinen Zugriff auf Netzwerk Laufwerke. Es sei denn:

  • das Share hat die NTFS Berechtigung “Jeder” und die Freigabe Berechtigung “Jeder”.
  • Man läßt den SQL Server Dienst unter einem Account der Domaine laufen, welcher die notwendigen Permissions hat.
  • Man meldet sich mit einem Domain Account anstatt einem SQL Login am Server an.
  • Mehr dazu kann man unter “Security Considerations” und “Bulk Importing from a Remote Data File” bei http://msdn.microsoft.com/en-us/library/ms175915.aspx gelesen werden.

Frustriert hat man es Stunden später vielleicht doch hinbekommen oder sich einen anderen Weg überlegt.

Aber mal angenommen wir möchten ein DAT Datei von einem Share adhoc in den SQL Server laden:

BULK INSERT [T_TEST]
FROM '\\server\share\test\T_TEST.dat'
WITH (
DATAFILETYPE = 'char',
TABLOCK,
CODEPAGE = '1252',
KEEPNULLS,
KEEPIDENTITY
);

Gegebenfalls hat das sogar von dem lokalen SQL Server funktioniert, aber auf dem eigentlichen Server will er das nicht laden.


Msg4861, Level 16, State 1, Line 2
Cannot bulk load because the file "\\server\share\test\T_TEST.dat" could not be opened. Operating system error code 5(Zugriff verweigert).

 

Um die Daten jetzt irgendwie doch (noch schnell) reinzuladen, können wir mal nachschauen, ob wir überhaupt in dem Verzeichnis lesen dürfen. Dafür brauchen wir kurzfristig die xp_cmdshell.

-- ‘Erweiterte Optionen anzeigen’ einschalten.
EXEC sp_configure 'show advanced options', 1;
-- Das System aktualisieren.
RECONFIGURE;
-- xp_cmdshell anschalten.
EXEC sp_configure 'xp_cmdshell', 1;
-- Das System aktualisieren.
RECONFIGURE;

 

Nun können wir den DIR Befehl auf den Zielpfad ausführen:

exec xp_cmdshell 'dir \\server\share\temp\'


Zugriff verweigert

Wir geben uns die notwendigen Rechte mit

exec xp_cmdshell 'net use \\server\share /user:<user>@<domain> <passwort>'


Der Befehl wurde erfolgreich ausgeführt.

Dann wiederum sollte der oben erwähnte DIR Befehl auch die Dateien in dem Verzeichnis anzeigen.

Volume in Laufwerk \\server\share\temp\: hat keine Bezeichnung.
Volumeseriennummer: 10XX-X58X
NULL
Verzeichnis von \\server\share\temp\
NULL
23.01.2008 10:16 8.423.195 T_TEST.dat
Nun den BULK INSERT ausführen und dieser sollte seine Arbeit mit der gewünschten Meldung quittieren:

(334.714 row(s) affected)

Jetzt noch aufräumen mit

-- Share trennen
exec xp_cmdshell 'net use \\server\share /delete';
-- xp_cmdshell abschalten.
EXEC sp_configure 'xp_cmdshell', 0;
-- Das System aktualisieren.
RECONFIGURE;

Abschließen bleibt noch zu sagen, das diese Variante nur dazu gedacht ist, mal Daten auf die Schnelle zu laden. xp_cmdshell ist „evil“ und sollte nur mit Bedacht genutzt werden. So wie man einen DIR absetzen kann, so kann man auch alle anderen Befehle absetzen !

Zu Risiken und Nebenwirkungen fragen Sie Ihren Administrator ;)

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Google
  • E-mail this story to a friend!
  • LinkedIn
  • MySpace
  • Netvibes
  • ThisNext
  • TwitThis
  • Yahoo! Buzz
  • MisterWong.DE
  • Webnews.de
  • Blogosphere News

Einen Kommentar schreiben

 

 

 

Diese HTML-Tags können verwendet werden

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>