Проверка запуска вставки MS SQL для правильного числового формата в столбце - PullRequest
0 голосов
/ 08 июня 2018

Мне нужен совет по коду,

при распечатке предложений наша ERP-программа генерирует идентификационный номер в таблице "Angebot" в формате AYYNNNNN, эта маска задается в административных настройках, но такжеимеет возможность переопределить этот номер и установить ручной, что вызывает много проблем, так как люди, как правило, ломают счетчик идентификаторов.

Я хотел бы создать триггер, который отправляет сообщение, когда идентификационный номер не в правильном формате, поэтому я должен проверить правильность этого конкретного столбца.

Элемент if проверяет следующее:

if (Angebotsnr NOT LIKE 'A'+RIGHT(DATEPART(yy,getdate())+'_____') then RAISEERROR

В базе данных уже существует триггер, который проверяет что-то еще, поэтому мне нужно только добавить вторую проверку, чтобы убедиться, чтоэто правильно, но куда бы я поместил оператор if и как его проверить?

Это код существующего триггера:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER TRIGGER [dbo].[ANGEBOT_ITrig] ON [dbo].[Angebot] FOR INSERT AS
SET NOCOUNT ON
/* * KEINE EINFÜGUNG BEI FEHLEN EINES PASSENDEN SCHLÜSSELS IN 'ErlGrp' */
IF (SELECT COUNT(*) FROM inserted) !=
   (SELECT COUNT(*) FROM ErlGrp, inserted WHERE (ErlGrp.ABTNR = inserted.ABTEILUNG))
    BEGIN
        RAISERROR ( 'Some error statement',0,0)
        ROLLBACK TRANSACTION
    END

Действие будет таким же,просто с другим сообщением об ошибке.Может кто-нибудь указать мне правильное направление.

Спасибо.

1 Ответ

0 голосов
/ 08 июня 2018

Я бы обработал это в процедуре, которая выполняет вставку, чтобы он никогда не вставлял и не запускал другие триггеры.

create proc myInsertProc (@ID char(8))
as
begin
    --copied from you, but it's missing part of the right function
    if (Angebotsnr NOT LIKE 'A'+RIGHT(DATEPART(yy,getdate())+'_____') 
    begin
        raiserror('You provided a wrongly formatted ID',16,1) with log
        return
    end
    ...continue on with other code
end

Это вызовет ошибку и запишет ее в SQL Server ErrorЖурнал.Вы можете удалить with log, если вы этого не хотите.return заканчивает партию.Если вы захотите, вы также можете заключить эту строку в зацепку попытки вставки.

Я бы использовал это в блоке IF лично.

if (Angebotsnr NOT LIKE 'A' + right(convert(varchar,DATEPART(year,getdate())),2) + '%' or len(Angebotsnr) != 8)
...