Benutzer mit den meisten Antworten
SQL Server soll PowerShell ausführen

Frage
-
hallo an alle, ich suche eine Möglichkeit eine Datei an Hand des "letzte Änderung" zu überprüfen ob eventuelle Tätigkeiten gemacht werden sollen. Nach langer Recherche bin ich auf PowerShell in Zusammenhang mit SQL Server gestoßen (Ok letzteres stand ja schon so gut wie fest *g*).
nun möchte ich das ein Skript schau ob die Datei in einem Ordner mehr als das höchste Datum in der einer Spate einer Tabelle ist.
ein erster Anfang für die Identifikation ist dieses nachfolgende Skript! Das funzt unter der Powershell Konsole bestens.
$path="c:\Video" [datetime]$test = "12.20.2014" $DateiAlter=$test # Zuweisung, die benutzt wird Foreach ($item in (dir –recurse $path)) { If (!( $item.PSIsContainer)) { If ($item.LastWriteTime –lt $DateiAlter) { Write-output "$($item.FullName)"#, $($item.LastWriteTime), $($item.Length)" } } }
Aber wie bekomme ich das nun im SQL Server zum laufen?
XP_CMDSHELL wurde aktiviert und folgendes funktioniert.
EXECUTEmaster..XP_CMDSHELL'ECHO ICH BIN EIN TEST'
Jedoch funktioniert dies nicht.
EXECUTEmaster..XP_CMDSHELL'GET-DATE'
Kann mir jemand auf die Sprünge helfen was ich verkehrt mache?
Antworten
-
Aber das sollte doch eigentlich richtig sein.
Wenn Du VB.NET nutzen würdest, wäre es halbwegs richtig; ich nehme an das hast Du auch von einem VB Beispiel.
Du sprichst die Variable "User::FilePath" über einen sogenannten Indexer an, in C# geht das aber über die eckigen Klammer [ ], nicht über die runden ( ) =>
Dts.Variables["User::FilePath"].Value.ToString()
Und "Value" müsste AFAIK auch groß geschrieben warden.
Olaf Helper
[ Blog] [ Xing] [ MVP]- Als Antwort markiert Toot_Braunstein Mittwoch, 22. April 2015 09:42
Alle Antworten
-
Der SQL Server Agent unterstützt Powershell nativ als Auftragsschritt-Typ.
(Ausführen von Windows PowerShell-Schritten in SQL Server-Agent)
Die xp_cmdshell kann und sollte man dafür weiterhin abgeschaltet lassen.
Andreas Wolter (Blog | Twitter)
MCSM: Microsoft Certified Solutions Master Data Platform, MCM, MVP
www.SarpedonQualityLab.com | www.SQL-Server-Master-Class.com- Als Antwort vorgeschlagen Andreas.WolterMicrosoft employee Mittwoch, 22. April 2015 09:55
-
Ah sehr gut dort hatte ich noch garnicht geschaut danke Olaf. Aber kann ich nicht auch irgendwie direkt mit dem Management Studio Abfragen machen die auch Powershell beinhalten? Genau diese Kombination benötige ich.
Einfache Abfragen funktionieren ja wie EXECUTEmaster..XP_CMDSHELL'ECHO ICH BIN EIN TEST'
-
Nicht über T-SQL Abfragen, aber Du kannst PowerShell direkt über SSMS starten: Ausführen von Windows PowerShell über SQL Server Management Studio, wobei dann SqlPs = SQL Server-PowerShell gestartet wird, das zusätzliche SQL CmdLets zur Verfügung stellt.
Olaf Helper
[ Blog] [ Xing] [ MVP] -
Aber das schafft mein SQL 2008 nicht oder? ich lese immer nur das dies erst ab 2012 möglich sei! deswegen habe ich nun mal quer zu diesem Thema geschaut ob das SSIS das kann. Jedoch auch hier Fehlanzeige! ich habe keinen Powershell Task.
Wichtig wäre eben für mich meinen Wunschziel mit Powershell näher zu kommen.
-
Hier sind zwei Artikel zu dem Thema und SQL Server 2008 R2:
https://technet.microsoft.com/de-de/library/cc281954(v=sql.105).aspx
Übersicht über SQL Server PowerShellhttps://technet.microsoft.com/de-de/library/cc281962(v=sql.105).aspx
Ausführen von SQL Server PowerShell
HTH!Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu -
Aber das schafft mein SQL 2008 nicht oder? ich lese immer nur das dies erst ab 2012 möglich sei! deswegen habe ich nun mal quer zu diesem Thema geschaut ob das SSIS das kann. Jedoch auch hier Fehlanzeige! ich habe keinen Powershell Task.
Wichtig wäre eben für mich meinen Wunschziel mit Powershell näher zu kommen.
Also laut Doku ist PS bereits in SQL Server 2008 als Job-Typ verfügbar.
https://technet.microsoft.com/de-de/library/cc281962%28v=sql.100%29?f=255&MSPPError=-2147217396
Ich habe keinen 2008er mehr zum testen, aber auf 2008 R2 habe ich es verifizieren können.
Zeig mir doch bitte mal das Ergebnis der folgenden Abfrage:
SELECT subsystem FROM msdb.dbo.syssubsystems
Andreas Wolter (Blog | Twitter)
MCSM: Microsoft Certified Solutions Master Data Platform, MCM, MVP
www.SarpedonQualityLab.com | www.SQL-Server-Master-Class.com- Bearbeitet Andreas.WolterMicrosoft employee Mittwoch, 15. April 2015 09:02
-
Ich glaube ich habe gerade das SQL PS gefunden. Zumindestens kann ich dort Powershell absetzen und bekomme eine Ausgabe! Das ist sehr schön!
Ich glaube das Skript von Andreas Wolter bestätigt dies auch (siehe Eintrag Powershell)
ActiveScripting
ANALYSISCOMMAND
ANALYSISQUERY
CmdExec
Distribution
LogReader
Merge
PowerShell
QueueReader
Snapshot
SSIS
TSQLDie Verwirrung kam zu Stand da ich in den Links stets den SQL Server 2008 auswählen wollte (unter Version) und dort der SQL 2008 nicht mehr aufgeführt war.
Ok Thema Powershell geht auf SQL Server nicht abgehakt! Gibt es aber auch irgendwo eine Seite wie man Variablen aus T-SQL in Powershell nutzen kann und anders herum.
Gibt es auch noch eine Möglichkeit den Powershell Task meinen BI-Studio (SSIS) beizubringen? kann man das irgendwie nachinstallieren im BI-Studio?
-
Ok Thema Powershell geht auf SQL Server nicht abgehakt!
Olaf Helper
[ Blog] [ Xing] [ MVP] -
...
Ok Thema Powershell geht auf SQL Server nicht abgehakt! Gibt es aber auch irgendwo eine Seite wie man Variablen aus T-SQL in Powershell nutzen kann und anders herum.
Gibt es auch noch eine Möglichkeit den Powershell Task meinen BI-Studio (SSIS) beizubringen? kann man das irgendwie nachinstallieren im BI-Studio?
wunderbar, dann sind wir ja auf der Zielgeraden.
Zum Thema Variablen-Austausch schau Dir mal den folgenden Thread an: http://stackoverflow.com/questions/22811357/how-to-pass-parameters-to-sql-script-via-powershell
BIDS selber ist ja nur eine Art Visual-Studio. SSIS kann man mittels PowerShell ansprechen bzw programmatisch ansprechen. Aber ob es das ist, was Du brauchst, weiss ich nicht. Sieh Dir mal folgende Threads an dazu:
http://blogs.msdn.com/b/mattm/archive/2011/11/17/ssis-and-powershell-in-sql-server-2012.aspx
http://www.databasejournal.com/features/mssql/ssis-2012-using-powershell-to-configure-package-execution-parameters.html
Im Projekt/Paket selber gibt es das meines Wissens nicht.
Andreas Wolter (Blog | Twitter)
MCSM: Microsoft Certified Solutions Master Data Platform, MCM, MVP
www.SarpedonQualityLab.com | www.SQL-Server-Master-Class.com -
zum Hintergrund vielleicht noch mal etwas weiter ausgeholt. Ziel ist es das Änderungsdatum mit Powershell besser zu nutzen.
Wenn das Änderungsdatum einer Datei größer ist als der Zeitstempel in einer Tabelle auf dem MS-SQL Server dann soll ein DTSX Paket gestartet werden. Das ganze soll aber über die Jobverwaltung des SQL Servers laufen!
Nun habe ich aber zwei Probleme zu beheben. Erstes Problem mein Wissensstand *g* daran lässt sich arbeiten. Zweitens mein BI Studio kenn nicht Powershell! Eine Testumgebung bei mir zu Hause schon! Deswegen weiß ich auch schon das es gehen könnte.
Das andere Problem das Powershell nicht auf meinen SQL Server 2008 geht konnte ich ja dank euer Hilfe revidieren.
Ein ganz anderer Ansatz könnte auch noch sein: Das Tool was die Daten anzeigt ist Excel man könnte über ein Makro auch eine Verbindung zum SQL Server aufbauen lassen und so könnten die Daten direkt vor Ort geändert werden. Aber bei der Lösung bin ich komplett raus da ich absolut keine Ahnung von VB habe.
-
Okay
und was fehlt jetzt noch?
Das Handwerkszeug ist ja vorhanden:
Der Auftragsschritt kann ja den Zeitstempel prüfen und dann entweder einen Fehler erzeigen, oder Erfolg vermelden und dann basierend darauf den nächsten Schritt starten oder halt nicht. Das BIDS hat damit mE nach Nichts zu tun.
Alternative:
In SSIS selber gibt es natürlich auch Tasks, die Dateiattribute prüfen können. Dann kann man sich den Powershell-Step sparen und einfach das Paket alle X Minuten/Stunden starten und das Paket prüft dann mit dem Dateisystem-Task, ob eine Weiterverarbeitung Sinn macht.
Ich hoffe, ich habe das Thema richtig erfasst.
Andreas Wolter (Blog | Twitter)
MCSM: Microsoft Certified Solutions Master Data Platform, MCM, MVP
www.SarpedonQualityLab.com | www.SQL-Server-Master-Class.com- Bearbeitet Andreas.WolterMicrosoft employee Mittwoch, 15. April 2015 14:56
-
Hallo Andreas,
ich kann mit SSIS das Dateiatribut wie letztes Änderungsdatum überprüfen? Könntest du mir hier ein Beispiel geben? Geht das mit allen Dateitypen? Bevorzugt XLSX (Excel)
Mir wäre das viel lieber wenn ich alles mit einer Lösung machen könnte.
-
Hallo
hier findet sich ein umfangreiches Beispiel, wie das Datum der letzten Änderung mittels Script-Task ermittelt.
- Also nicht mit dem Dateisystem-Task, da hab ich mich falsch erinnert. Mit dem kann man nur grob gesagt Dateien kopieren etc und Attribute ändern.
Der Dateityp ist bei einer so simplen Prüfung so oder so egal. :)
Andreas Wolter (Blog | Twitter)
MCSM: Microsoft Certified Solutions Master Data Platform, MCM, MVP
www.SarpedonQualityLab.com | www.SQL-Server-Master-Class.com- Als Antwort vorgeschlagen Andreas.WolterMicrosoft employee Mittwoch, 22. April 2015 09:55
-
Hallo Andreas,
genau solche eine Lösung habe ich gesucht. Das ist ja sozusagen das gleiche was ich mit PS vor hatte nun aber in C.
Aber das mit der Messagebox bekomme ich nicht hin.
using System; using System.Data; using Microsoft.SqlServer.Dts.Runtime; using System.Windows.Forms; namespace ST_ddad702c97574a84a9ef32a3a5117ce2.csproj { [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")] public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase { #region VSTA generated code enum ScriptResults { Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure }; #endregion public void Main() { // TODO: Add your code here Dts.TaskResult = (int)ScriptResults.Success; Messagebox.Show(Dts.Variables("User::FilePath").value.ToString()); } } }
in dem Comments steht das man include System.Windows.Forms nutzen soll. Aber ich wüsste nicht warum ich das includieren soll?! Er nutzt doch schon using System.Windows.Forms und wenn ich einfach nach den using Bereich im Skript mit dem include komme läuft er trotzdem auf Fehler.
Kannst du mir sagen wo mein Fehler liegt?
-
Hallo
meine .Net Skills, sind leider nicht so ausgeprägt.
Aber: warum würde man aus einem Background task heraus eine Message-Box erzeiugen wollen?
Zum Debuggen kann ich es mir ja gerade noch vorstellen. Aber dann müsste es eh wieder raus. Ich würde mir also da keine Mühe mit geben sondern einfach das Debug-Window mit den Variablen verwenden. Das ist ja genau dafür da. Ich spare mir jetzt mal einen Link, da google da gleich massig zu auswirft. :)
Andreas Wolter (Blog | Twitter)
MCSM: Microsoft Certified Solutions Master Data Platform, MCM, MVP
www.SarpedonQualityLab.com | www.SQL-Server-Master-Class.com -
Hallo Andreas,
danke noch mal für das Skript. Bis jetzt läuft es erst mal aber! mit Einschränkungen. Da ich mit dem V-Studio nicht so ganz Klarkomme nutze ich das was ich weiß. Ich lass mir einfach den Inhalt der Variablen per Mail schicken. Nun habe ich aber das Problem das die Variable
Value = fileInfo.LastWriteTime;
// steht für
vars["User::FileLastModifiedDate"]
nicht
Das zeigt aber nicht das oder macht nicht das was es soll.
Denn das Änderungsdatum steht auf 16.4.2015 16:23 Uhr (ist eine TXT-Datei) jedoch wird das Datum 16.4.2015 8:39 Uhr übermittelt. Noch besser ist daran, das das Erstellungsdatum auf 16.4.2015 9:37 Uhr steht.
Schön zu sehen ganz unten bei dem Bild ist der Inhalt der Variablen.
-
Aber das mit der Messagebox bekomme ich nicht hin.
.... Messagebox.Show(Dts.Variables("User::FilePath").value.ToString());
C# (und nicht C) ist Case Sensitive und richtig heisst es MessageBox Class, also mit einem großem B bei Box. Am besten sich immer von IntelliSense unterstützen lassen.Olaf Helper
[ Blog] [ Xing] [ MVP] -
Hallo Olaf,
danke für deinen Tipp! IntelliSense ist an und meckert nun auch fleißig. Irgendwie kommt er noch nicht mit "Variables" zu recht. Aber das sollte doch eigentlich richtig sein. Mein V-Studio läuft in Deutsch aber der Source ändert sich ja dadurch nicht.
-
Aber das sollte doch eigentlich richtig sein.
Wenn Du VB.NET nutzen würdest, wäre es halbwegs richtig; ich nehme an das hast Du auch von einem VB Beispiel.
Du sprichst die Variable "User::FilePath" über einen sogenannten Indexer an, in C# geht das aber über die eckigen Klammer [ ], nicht über die runden ( ) =>
Dts.Variables["User::FilePath"].Value.ToString()
Und "Value" müsste AFAIK auch groß geschrieben warden.
Olaf Helper
[ Blog] [ Xing] [ MVP]- Als Antwort markiert Toot_Braunstein Mittwoch, 22. April 2015 09:42