none
Automastische Prozedur, die um Mitternacht ausgelöst wird. RRS feed

  • Frage

  • Hallo in die Runde!

    In einer Datenbank erfasse ich Maschinendaten verschiedenster Art, die von den Mitarbeitern eingegeben werden. Bei Ereignisauslösung wird in dbo.Ereignisse eine Neue Zeile angelegt und in der Spalte "Start" der Timestamp geschrieben. Gleichzeitig wird das letzte Ereignis der entsprechenden Maschine (FK_id_Maschine) herausgesucht und dort der Timestamp in der Spalte "Ende" eingetragen.

    Jetzt möchte ich aber, dass der Server um Mitternacht automatisch diese Tabelle durchläuft und nach noch offenen "Ende"-Zellen sucht und diese mit der Zeit aus der Spalte "Schichtende" auffüllt. Im SQL Server Management Studio gibt es ja sowas wie "Gespeicherte Prozeduren". Wie funktionieren diese?

    Anbei die Tabellenscripte zum ausprobieren.

    VIELEN DANK!
    Manu

    ----------------------------------------------------------------------------------------------------------------------

    Tabelle

    USE [tempdb]
    GO
    
    /****** Object:  Table [dbo].[Ereignisse]    Script Date: 11.05.2017 09:44:39 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[Ereignisse](
    	[Id] [int] IDENTITY(1,1) NOT NULL,
    	[Datum] [date] NOT NULL CONSTRAINT [DF_Maschinenzeiten_Laufzeit]  DEFAULT ('00:00:00'),
    	[Start] [datetime2](7) NOT NULL CONSTRAINT [DF_Maschinenzeiten_Stillstand]  DEFAULT (NULL),
    	[Ende] [datetime2](7) NULL,
    	[Menge] [int] NULL,
    	[Ausschuss] [int] NULL,
    	[Produktion] [bit] NOT NULL CONSTRAINT [DF_Maschinenzeiten_Produktion]  DEFAULT ((0)),
    	[Schichtstart] [time](0) NULL,
    	[Schichtende] [time](0) NOT NULL,
    	[FK_id_Maschine] [int] NOT NULL,
    	[FK_id_Betriebsauftrag] [int] NOT NULL,
    	[FK_id_Arbeitsgang] [int] NOT NULL,
    	[FK_id_Stillstandsgrund] [int] NULL,
    	[FK_id_Mitarbeiter] [int] NULL,
     CONSTRAINT [PK_Maschinenzeiten] PRIMARY KEY CLUSTERED 
    (
    	[Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    ALTER TABLE [dbo].[Ereignisse] SET (LOCK_ESCALATION = AUTO)
    GO
    
    ALTER TABLE [dbo].[Ereignisse]  WITH CHECK ADD  CONSTRAINT [Arbeitsgänge_Ereignisse] FOREIGN KEY([FK_id_Arbeitsgang])
    REFERENCES [dbo].[Arbeitsgänge] ([ID])
    GO
    
    ALTER TABLE [dbo].[Ereignisse] CHECK CONSTRAINT [Arbeitsgänge_Ereignisse]
    GO
    
    ALTER TABLE [dbo].[Ereignisse]  WITH CHECK ADD  CONSTRAINT [Betriebsauftraege_Ereignisse] FOREIGN KEY([FK_id_Betriebsauftrag])
    REFERENCES [dbo].[Betriebsaufträge] ([Id])
    GO
    
    ALTER TABLE [dbo].[Ereignisse] CHECK CONSTRAINT [Betriebsauftraege_Ereignisse]
    GO
    
    ALTER TABLE [dbo].[Ereignisse]  WITH CHECK ADD  CONSTRAINT [Maschine_Ereignisse] FOREIGN KEY([FK_id_Maschine])
    REFERENCES [dbo].[Maschinen] ([Id])
    GO
    
    ALTER TABLE [dbo].[Ereignisse] CHECK CONSTRAINT [Maschine_Ereignisse]
    GO
    
    ALTER TABLE [dbo].[Ereignisse]  WITH CHECK ADD  CONSTRAINT [Mitarbeiter_Ereignisse] FOREIGN KEY([FK_id_Mitarbeiter])
    REFERENCES [dbo].[Mitarbeiter] ([Id_MA])
    GO
    
    ALTER TABLE [dbo].[Ereignisse] CHECK CONSTRAINT [Mitarbeiter_Ereignisse]
    GO
    
    ALTER TABLE [dbo].[Ereignisse]  WITH CHECK ADD  CONSTRAINT [Stillstandsgrund_Ereignisse] FOREIGN KEY([FK_id_Stillstandsgrund])
    REFERENCES [dbo].[Stillstandsgründe] ([Id])
    GO
    
    ALTER TABLE [dbo].[Ereignisse] CHECK CONSTRAINT [Stillstandsgrund_Ereignisse]
    GO
    
    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'rrrr' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Ereignisse', @level2type=N'CONSTRAINT',@level2name=N'Stillstandsgrund_Ereignisse'
    GO

    Insert für Daten

    USE [tempdb]
    GO
    
    INSERT INTO [dbo].[Ereignisse]
               ([Datum]
               ,[Start]
               ,[Ende]
               ,[Menge]
               ,[Ausschuss]
               ,[Produktion]
               ,[Schichtstart]
               ,[Schichtende]
               ,[FK_id_Maschine]
               ,[FK_id_Betriebsauftrag]
               ,[FK_id_Arbeitsgang]
               ,[FK_id_Stillstandsgrund])
         VALUES
               (<Datum, date,>
               ,<Start, datetime2(7),>
               ,<Ende, datetime2(7),>
               ,<Menge, int,>
               ,<Ausschuss, int,>
               ,<Produktion, bit,>
               ,<Schichtstart, time(0),>
               ,<Schichtende, time(0),>
               ,<FK_id_Maschine, int,>
               ,<FK_id_Betriebsauftrag, int,>
               ,<FK_id_Arbeitsgang, int,>
               ,<FK_id_Stillstandsgrund, int,>)
    GO



    Donnerstag, 11. Mai 2017 07:55

Antworten

Alle Antworten

  • Hallo Manu

    Da der Express keinen Agent hat, kannst du den Windows Aufgabenplaner nutzen und eine Aufgabe erstellen welche einen Powershell Befehl absetzt nach dem Muster. 

    Invoke-Sqlcmd -Query "exec meineSP" -ServerInstance "MyComputer\MyInstance"  

    Benjamin Hoch
    MCSE: Data Platform & Data Management and Analytics
    MCSA: SQL Server 2012/2014 & 2016 DB Administration
    MCSA: Windows Server 2012

    Donnerstag, 11. Mai 2017 08:35
  • Hallo Benjamin,

    danke für deine Antwort!

    Könntest du das etwas konkretisieren? Diese Sache habe ich bislang nie gemacht und bräuchte da etwas Futter, wie man da vorgeht und wo man zB. die Prozedur hinterlegt.
    Gibt es dazu Tutorials?

    Lg
    Manu

    Donnerstag, 11. Mai 2017 12:32
  • Hallo Manu,

    du kannst entweder dein Skript direkt in den Skriptblock der Powershell einbetten und dann ausführen lassen. Eine Beschreibung mit einer ähnlichen Aufgabenstellungen habe ich hier beschrieben.

    https://www.faq-o-matic.net/2017/01/09/sql-server-express-datensicherung-ber-powershell/

    Wenn du eine gespeicherte Prozedur erstellen willst dann findest du entsprechende Anleitungen unter 

    https://technet.microsoft.com/de-de/library/ms190669(v=sql.105).aspx

    diese Prozedur könntest du dann über die Powershell starten lassen

    Ich hoffe mal dass es etwas klarer geworden ist.

    Gruß 


    Benjamin Hoch
    MCSE: Data Platform & Data Management and Analytics
    MCSA: SQL Server 2012/2014 & 2016 DB Administration
    MCSA: Windows Server 2012

    Donnerstag, 11. Mai 2017 14:19
  • Hallo Benjamin,

    vielen Dank.
    Werde mich noch mit dem Futter beschäftigen müssen. Scheint doch etwas tricky zu sein.

    Grüße
    Manu

    Mittwoch, 17. Mai 2017 09:24