Hallo Zusammen,
bis vor ein paar Wochen hatte ich mit SQL so rein gar nichts zu tun.
Jetzt hab ich mich da ein bisschen rein gearbeitet aber letztlich wie so oft komme ich alleine nicht weiter.
Ich habe einen SQLServer2008R2.
Dieser Hostet eine Datenbank für ein Antivirenssystem,
Das Schema, alle Prozeduren usw. unterliegen der Herstellerlizenz.
Das Ziel ist ein Risikoevent an unser Tickesystem zu senden.
das Ticketsystem kann über eine Schnittstelle mit einem XML gefüttert werden, dass zwingend UTF-8 Benötigt.
MSSQL kann aber nur UTF-16.
Ich habe eine Query erstellt, die alle relevanten Daten enthält. Ein Kollege hat hierzu ein passenden PowershellScript geliefert.
Das PS wird per SQL-Agent-Job und cmdexec angesprochen.
Wird er Job manuell ausgeführt wird ein Ticket erstellt.
Ich wollte einen Trigger erstellen. (Der Hersteller macht hier keine Probleme)
Ich hab mir die Schemareferenz besorgt und Tabellen identifiziert, die für den Trigger in Frage kommen.
Sobald ich jedoch einen Trigger auf egal welche Tabelle setze kommen in der Tabelle keinerlei Daten mehr an.
Nicht einmal wenn ich den Trigger disable und er einfach nur da ist.
Da ich dieses Problem nicht lösen kann habe ich einen Job erstellt, der einfach nur Daten aus einer DB in eine andere DB kopiert und das im 45 Sekunden Takt.
Das wird nicht sonderlich Performant werden aber darüber soll ich mir keine Gedanken machen
Gleichzeitig wird geprüft ob eine IDX bereits vorhanden ist.
"Where Al.IDX not in (SELECT idx FROM Test.dbo.TAB_ITSM_TEST)"
Wenn nicht, soll der Datensatz kopiert werden.
Erstaunlicherweise funktioniert das völlig Problemlos.
Jetzt möchte ich, auf dieser Tabelle den Trigger setzten.
Der Trigger soll nach Insert einen Job ausführen.
Egal was ich bisher geschrieben habe, immer wenn der CopyJob läuft (auf dem Testssystem alle 45 Sekunden)
startet auch der Job der das PowerShellscript ausführt.
Jedes mal, egal ob ein Datensatz eingefügt wurde oder nicht.
Das bedeutet, ich generiere Tickets alle 45 Sekunden egal ob das Event bereits vorhanden ist oder nicht.
(das ist für mich schon ein echter Fortschritt
)
Ich bin mir sicher das Problem sitzt VOR der Datenbank.
Ich dachte es wäre ganz einfach sowas wie:
Kann mir bitte jemand helfen, damit der Trigger nur dann den Job startet, wenn auch WIRKLICH ein Insert in den Table passiert ist?
bis vor ein paar Wochen hatte ich mit SQL so rein gar nichts zu tun.
Jetzt hab ich mich da ein bisschen rein gearbeitet aber letztlich wie so oft komme ich alleine nicht weiter.
Ich habe einen SQLServer2008R2.
Dieser Hostet eine Datenbank für ein Antivirenssystem,
Das Schema, alle Prozeduren usw. unterliegen der Herstellerlizenz.
Das Ziel ist ein Risikoevent an unser Tickesystem zu senden.
das Ticketsystem kann über eine Schnittstelle mit einem XML gefüttert werden, dass zwingend UTF-8 Benötigt.
MSSQL kann aber nur UTF-16.
Ich habe eine Query erstellt, die alle relevanten Daten enthält. Ein Kollege hat hierzu ein passenden PowershellScript geliefert.
Das PS wird per SQL-Agent-Job und cmdexec angesprochen.
Wird er Job manuell ausgeführt wird ein Ticket erstellt.
Ich wollte einen Trigger erstellen. (Der Hersteller macht hier keine Probleme)
Ich hab mir die Schemareferenz besorgt und Tabellen identifiziert, die für den Trigger in Frage kommen.
Sobald ich jedoch einen Trigger auf egal welche Tabelle setze kommen in der Tabelle keinerlei Daten mehr an.
Nicht einmal wenn ich den Trigger disable und er einfach nur da ist.
Da ich dieses Problem nicht lösen kann habe ich einen Job erstellt, der einfach nur Daten aus einer DB in eine andere DB kopiert und das im 45 Sekunden Takt.
Das wird nicht sonderlich Performant werden aber darüber soll ich mir keine Gedanken machen
Code:
Use xxxxx
Begin
INSERT INTO Test.dbo.TAB_XXX_TEST
SELECT TOP(1)
V_AL.idx
, V.VIRUSNAME
, VC.COMPUTER_NAME
, V_al.Description
, G.NAME as 'Client-Group'
, D.Name as 'AV-Domain'
, VC.IP_ADDR1_TEXT
, V_AL.Filepath
, V_AL.Source
, AA.ACTUALACTION
, V_AL.Alertdatetime
, V_AL.Alertinserttime
, V_AL.ALERTENDDATETIME
From dbo.V_ALERTS as V_AL
inner Join dbo.V_VIRUS as V on V_AL.VIRUSNAME_IDX = V.VIRUSNAME_IDX
inner join dbo.ACTUALACTION as AA on V_AL.ACTUALACTION_IDX = AA.ACTUALACTION_IDX
inner join dbo.V_SEM_COMPUTER as VC on V_AL.COMPUTER_IDX = Computer_ID
inner join dbo.V_GROUPS as G on V_AL.CLIENTGROUP_IDX = G.ID
inner Join dbo.V_DOMAINS as D on G.DOMAIN_ID = D.ID
Where V_AL.IDX not in (SELECT idx FROM Test.dbo.TAB_ITSM_TEST)
Group by
D.Name
, V_AL.Alertdatetime
, V_AL.Filepath
, V_AL.Description
, V_AL.ALERTENDDATETIME
, V_AL.Alertinserttime
, AA.ACTUALACTION
, VC.COMPUTER_NAME
, G.NAME
, V_AL.Source
, VC.IP_ADDR1_TEXT
, V_AL.ALERT_IDX, al.idx
, V.VIRUSNAME
order by ALERTDATETIME desc
end
Gleichzeitig wird geprüft ob eine IDX bereits vorhanden ist.
"Where Al.IDX not in (SELECT idx FROM Test.dbo.TAB_ITSM_TEST)"
Wenn nicht, soll der Datensatz kopiert werden.
Erstaunlicherweise funktioniert das völlig Problemlos.
Jetzt möchte ich, auf dieser Tabelle den Trigger setzten.
Der Trigger soll nach Insert einen Job ausführen.
Egal was ich bisher geschrieben habe, immer wenn der CopyJob läuft (auf dem Testssystem alle 45 Sekunden)
startet auch der Job der das PowerShellscript ausführt.
Jedes mal, egal ob ein Datensatz eingefügt wurde oder nicht.
Das bedeutet, ich generiere Tickets alle 45 Sekunden egal ob das Event bereits vorhanden ist oder nicht.
(das ist für mich schon ein echter Fortschritt

Ich bin mir sicher das Problem sitzt VOR der Datenbank.
Ich dachte es wäre ganz einfach sowas wie:
Code:
USE [Test]
GO
/****** Object: Trigger [dbo].[TR_ITSM_TEST] Script Date: 04/29/2016 20:28:30 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER TRIGGER [dbo].[TR_ITSM_TEST]
ON [dbo].[TAB_ITSM_TEST]
After insert
AS
BEGIN
exec msdb.dbo.sp_start_job 'ITSM-Ticket_Job'
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
END
Kann mir bitte jemand helfen, damit der Trigger nur dann den Job startet, wenn auch WIRKLICH ein Insert in den Table passiert ist?