У меня есть проблема, которую я не могу решить, у меня есть точка продажи, которая вставляет 3 таблицы после продажи чего-либо, таблицу заголовков, детали и клиентов (в таком порядке).
У меня есть сохраненныйпроцедура, которая вставляет последнюю запись в таблицу bak, в столбце «текст» он вставляет объединенные из 3 таблиц (это принципиально), в то же время у меня есть метод вещи, который собирает все детали в одну строку ссоответствующий заголовок (только одна строка на заголовок), при выполнении процедуры после вставки она работает нормально, но при выполнении с триггером появляется ошибка, что нулевое значение не может быть вставлено в столбец «текст», это потому, чтотриггер указывает на заголовок таблицы и на другие 2 таблицы, которые не заполняются, если я укажу это на уровне детализации, метод stuff не будет работать (поскольку он вставляет одну запись в заголовок), идея состоит в том, чтобы указать наЗаголовок таблицы, но подождите, пока все не будет завершено, есть ли способ сделать это?Я ничего не могу коснуться с точки продажи, все было бы на уровне базы данных (SQL SERVER 2008), что-то можно сделать?Может ли триггер быть отложен так, чтобы он ожидал завершения заполнения двух других таблиц?
- INTERMEDIATE TABLE
CREATE TABLE [bak]
(
[id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[date] [date] NOT NULL,
[serie] [varchar](2) NOT NULL,
[text] [varchar](6000) NOT NULL
);
-ПРОЦЕДУРА МАГАЗИНА
CREATE PROCEDURE sp_bak
AS
BEGIN
;
WITH CTE
AS (SELECT
h.date InsertDate,
h.series DocumentSerie,
('349891894' + h.date + h.series + h.total +
h.type + CHAR(13) + CHAR(10)) HeaderData,
(d.quantity + d.price + d.description + c.name +
c.identification) DetailData
FROM header h
FULL JOIN detail d
ON a.cod = b.cod
FULL JOIN customers c
ON b.cod = c.cod)
INSERT dbo.bak (date, serie, text)
SELECT TOP 1
InsertDate,
DocumentSerie,
HeaderData + REPLACE(STUFF((SELECT
';' + DetailData
FROM CTE C
WHERE C.HeaderData = T.HeaderData
FOR xml PATH ('')), 1, 1, ''), ';', CHAR(13) + CHAR(10))
FROM CTE T
GROUP BY HeaderData,
DocumentSerie,
InsertDate
order by InsertDate DESC
END
- ТРИГГЕР
CREATE TRIGGER dbo.tr_bak
ON dbo.header
AFTER INSERT
AS
BEGIN
EXEC sp_bak
END
GO
- ОШИБКА
Msg 515, Level 16, State 2, Procedure sp_bak, Line 4
Cannot insert the value NULL into column 'text', table 'VIDEOJUEGOS.dbo.bak'; column does not allow nulls. INSERT fails.