połaczenie bazy i triggera

0

Witam,

Mam do szanownego grona zapytanie.
mam zainstalowany program n1 który łączy się z bazą sql w której to jest tabela exportevent, drugi program n2 wykonuje do w/w bazy do tabeli IV_log zapytanie, zapytanie wykonywane jest pomiędzy tabelami jest przez Trigger.(trigger pomiędzy exportevent a IV_log)
Program n2 ma możliwość wyciągnąć z bazy tylko dwa rekordy (IV_alarm i Data), do rekordu IV_alarm można wysłać na tą chwilę tylko jedną informacje o zdarzeniu np; ID, nazwa, tym zdarzenia itp, która jest zbyt ogólnikowa bo są wpisy o tej samej nazwie.
potrzebuje napisać coś żeby wyciągnąć z bazy z tabeli exportevent z rekordów ID, Naza, tym zdarzenia oraz stan i wysłać je wszystkie do tabeli IV-log rekord IV_alarm.
Poniżej trigger

USE [baza]
GO


ALTER TRIGGER [dbo].[IV_LOG_TRIGGER]
ON [dbo].[IV_LOG]
FOR INSERT
AS

INSERT INTO
    IV_LOG
    (
    IV_ALARM_STRING,
    EVENT_DATE
    )

SELECT
    INSERTED.IV_ALARM_STRING,
    INSERTED.EVENT_DATE

FROM
    INSERTED

GO

Ma ktoś jakiś pomysł, tak szukam też w google.
Z góry dzięki za pomoc

4

powiem szczerze, że nie rozumiem :(

0

Ja też nic nie rozumiem z tego opisu.

Po pierwsze autorze postaraj się opisać po polsku, co to jest baza sql i czy to co wypisałeś jest nazwami kolumn? Jakie masz tabele w bazie?
Wypisz w punktach co chcesz uzyskać.
Przedstaw nam też swój schemat, wtedy będziemy wiedzieć jakie masz tabele i jakie w nich kolumny.
I ostatnie pytanie co to za trigger? Czy chcesz wstawić nim dane z tabeli inserted?

0

Wiem że to zawiłe,
program n1 generuje log do dbo.expoevents który składa się z danych w załączniku czerwone poziome podkreślenie to jest jedna tabela. Program n2 za pomocą triggera wykonuje odpytanie z tabeli z podkreślenia poziomego.
Program n2 jest w stanie wyciągnąć tylko jedną informacje z zaznaczeń czerwonych czyli eventty lub entrancename lub accespointname ( eventty cyfry poniżej, entrancename nazwy poniżej itd)
Nie mogę zmienić nazw kolumn z zapytania w pierwszym poście, informacje z (eventty entrancename accespointname) muszę wcisnąć do IV_ALARM_STRING,

2

Wytłumacz mi jedno, robisz trigger na tabeli [dbo].[IV_LOG] w którym robisz inserta do tej samej tabeli czyli IV_LOG, natomiast w opisie masz tabelę dbo.expoevents, a dane chcesz "wcisnąć" do IV_ALARM_STRING.

Zamiast opisywać co robią programy, napisz co chcesz robić na pozimie danych, czyli opis w stylu:

Przy dodawaniu do tabeli dbo.expoevents chce przegrać dodawane rekordy do IV_ALARM_STRING

0

Całe zamieszanie przez to że źle wstawiłem tregger.

USE [baza]
GO

CREATE TRIGGER [dbo].[IV_LOG_TRIGGER]
ON [dbo].[exportevents]
FOR INSERT
AS

INSERT INTO
IV_LOG
(
IV_ALARM_STRING,
EVENT_DATE
)

SELECT
INSERTED.IV_ALARM_STRING,
INSERTED.EVENT_DATE

FROM
INSERTED

GO

Z tabeli dbo.expoevents która składa się z poniższych kolumn. Natomiast z konkretnych kolumn ( [eventtype], [entrancename], [intvalue] ) chcę
przesłać zawartość do tabeli [dbo].[IV_LOG] do kolumny [dbo].[IV_ALARM_STRING]

ELECT TOP 1000 [id]
,[timestamp]
,[eventtype]
,[hostname]
,[entrancename]
,[accesspointname]
,[carriertype]
,[lastname]
,[imt]
,[personnelnr]
,[depart_firm]
,[unit]
,[identifiernr]
,[identifiertype]
,[direction]
,[rejectreason]
,[item]
,[description]
,[state]
,[intvalue]
,[attributes]
,[carrierobjectid]

0

To od początku, tabela inserted ma strukturę taka jak tablea którego dotyczy, więc jeżeli dobrze rozumiem, chcesz mieć zapisana datę zdarzenia event_date choć takiej kolumny nie widzę w tabeli dbo.expoevents, domyślam się, ze chodzi o timestamp, a do .IV_ALARM_STRING zbitkę z 3 kolumn.

więc w ten sposób:

CREATE TRIGGER [dbo].[IV_LOG_TRIGGER]
ON [dbo].[exportevents]
FOR INSERT
AS
INSERT INTO IV_LOG (
IV_ALARM_STRING,
EVENT_DATE)
SELECT
    ,'eventtype: ' + eventtype + ', entrancename: ' + entrancename + ', intvalue: ' +  intvalue
    ,TIMESTAMP
FROM
    INSERTED

Oczywiście to zadziała tylko jeżeli kolumny [eventtype], [entrancename], [intvalue] są tego samego typu i nie są nullami, jeżeli np. intvalue jest integerm to musisz dokonać konwersji: cast(intvalue as varchar(10)), jeżeli kolumna jest nullowa to uzyj dodatkowo funkcji isnull: isnull(cast(intvalue as varchar(10)),'').

Najprościej to przetestuj to sobie na tabeli takim zapytaniem:

SELECT
    ,'eventtype: ' + eventtype + ', entrancename: ' + entrancename + ', intvalue: ' +  intvalue as IV_ALARM_STRING
    ,TIMESTAMP as EVENT_DATE
FROM
    [dbo].[exportevents]

I zobacz czy masz oczekiwany wynik, później dodaj do triggera

0

Bo event_date to w tabeli dbo.expoevent jet to [timestamp]

W zasadzie kolumn mają różna strukturę
IV_ALARM_STRING - NVARCHAR(50)

,[eventtype]- BIGINT
,[entrancename] - NVARCHAR(50)
[accesspointname] - NVARCHAR(50)
,[intvalue] -INT

0
Panczo napisał(a):

To od początku, tabela inserted ma strukturę taka jak tablea którego dotyczy, więc jeżeli dobrze rozumiem, chcesz mieć zapisana datę zdarzenia event_date choć takiej kolumny nie widzę w tabeli dbo.expoevents, domyślam się, ze chodzi o timestamp, a do .IV_ALARM_STRING zbitkę z 3 kolumn.

więc w ten sposób:

CREATE TRIGGER [dbo].[IV_LOG_TRIGGER]
ON [dbo].[exportevents]
FOR INSERT
AS
INSERT INTO IV_LOG (
IV_ALARM_STRING,
EVENT_DATE)
SELECT
    ,'eventtype: ' + eventtype + ', entrancename: ' + entrancename + ', intvalue: ' +  intvalue
    ,TIMESTAMP
FROM
    INSERTED

Oczywiście to zadziała tylko jeżeli kolumny [eventtype], [entrancename], [intvalue] są tego samego typu i nie są nullami, jeżeli np. intvalue jest integerm to musisz dokonać konwersji: cast(intvalue as varchar(10)), jeżeli kolumna jest nullowa to uzyj dodatkowo funkcji isnull: isnull(cast(intvalue as varchar(10)),'').

Najprościej to przetestuj to sobie na tabeli takim zapytaniem:

SELECT
    ,'eventtype: ' + eventtype + ', entrancename: ' + entrancename + ', intvalue: ' +  intvalue as IV_ALARM_STRING
    ,TIMESTAMP as EVENT_DATE
FROM
    [dbo].[exportevents]

I zobacz czy masz oczekiwany wynik, później dodaj do triggera

Od razu dostałem komunikat Error converting data type varchar to bigint. czyli konwersje trzeba

0

No to dopisz sobie konwersje, bez podania typów pól nie ma co zgadywać...

0
Panczo napisał(a):

No to dopisz sobie konwersje, bez podania typów pól nie ma co zgadywać...

Panczo, czy jesteś w stanie mi pomóc z tym zapytaniem i konwersja bo od tego kombinowania już mi się wszystkie pomysły wyczerpały, a tez sql nie jest moja mocną stroną.

0

Jakiego typu są pola: IV_ALARM_STRING, [eventtype], [entrancename], [intvalue]

0

IV_ALARM_STRING - NVARCHAR(50)

,[eventtype]- BIGINT
,[entrancename] - NVARCHAR(50)
[accesspointname] - NVARCHAR(50)
,[intvalue] -INT

0
N'eventtype: ' + isnull(cast(eventtype as nvarchar),N'') + N', entrancename: ' + isnull(entrancename,'') + N', intvalue: ' +  isnull(cast(intvalue as nvarchar),N'')

Pytanie tylko jak chcesz zmieścić do kolumny o długości 50 znaków, cos co może przekroczyć tę wartość?

0
Panczo napisał(a):
N'eventtype: ' + isnull(cast(eventtype as nvarchar),N'') + N', entrancename: ' + isnull(entrancename,'') + N', intvalue: ' +  isnull(cast(intvalue as nvarchar),N'')

Pytanie tylko jak chcesz zmieścić do kolumny o długości 50 znaków, cos co może przekroczyć tę wartość?

To jest dobre pytanie,

ale chyba usunę cała tabele IV_LOG i stworze od nowa

0

Nie cytuj postów na które bezpośrednio odpowiadasz...

Nie twórz od nowa tylko zmień rozmiar kolumny

0

Tak właśnie zrobiłem, zmieniłem rozmiar

0

Panczo dzięki wielki za pomoc działa jak potrzeba.

1 użytkowników online, w tym zalogowanych: 0, gości: 1