Ошибка запускающего правила - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть триггер, который вызывает процедуру базы данных, которая регистрирует все изменения для каждого столбца в определенной таблице, но когда срабатывает триггер, я получаю сообщение об ошибке

Сообщение 8114, уровень 16, состояние 5,Процедура dp_PolicyBenefit_audit, строка 0
Ошибка преобразования типа данных nvarchar в int.

У меня есть триггеры INSERT и UPDATE для каждого столбца в PolicyBenefit, всего 100 - кодниже показан только один

drop procedure if exists dp_PolicyBenefit_audit
GO

create procedure dp_PolicyBenefit_audit
  @p_policy_id               varchar(20),
  @p_id                      int,
  @p_benefit_cd              char(4),
  @p_seq                     smallint,
  @p_operation               varchar(10),
  @p_description             varchar(100),
  @p_old_value               varchar(20),
  @p_new_value               varchar(20)
AS

  if (@p_operation = 'INSERT')
  begin
    insert into PolicyBenefitAudit
    (
        PolicyNo,
        EntityNo,
        BenefitCode,
        BenefitSequence,
        Description,
        OldValue,
        NewValue,
        CreatedBy, 
        CreatedDate
    )
    values
    (
      @p_policy_id,
      @p_id,
      @p_benefit_cd,
      @p_seq,
      @p_description,
      null,
      @p_new_value,
      user_name(),
      getdate()
    )
  end


  if (@p_operation = 'UPDATE') and isnull(@p_old_value,'') != isnull(@p_new_value,''))
  begin
    insert into PolicyBenefitAudit
    (
        PolicyNo,
        EntityNo,
        BenefitCode,
        BenefitSequence,
        Description,
        OldValue,
        NewValue,
        CreatedBy, 
        CreatedDate
    )
    values
    (
      @p_policy_id, 
      @p_id,
      @p_benefit_cd, 
      @p_seq,
      @p_description,
      @p_old_value,
      @p_new_value,
      user_name(),
      getdate()
    )
  end

GO


drop trigger if exists dt_PolicyBenefit_OccupationCode_upd
GO

create trigger dt_PolicyBenefit_OccupationCode_upd on PolicyBenefit
after update as
begin
    declare
        @old_OccupationCode varchar(100)
    select @old_OccupationCode = cast(OccupationCode as varchar(100)) from deleted
    exec dp_PolicyBenefit_audit @p_policy_id = PolicyNo, 
     @p_id = EntityNo, 
    @p_benefit_cd = BenefitCode, 
    @p_seq = BenefitSequence,
         @p_operation = 'UPDATE',
         @p_description = 'Occupational Per Mille loading duration (in years)',
         @p_old_value = @old_OccupationCode,
         @p_new_value = OccupationCode
end
GO

Ожидается процедура вставки строки в таблицу PolicyBenefitAudit

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Удалили все процедуры базы данных и закодировали в 50 триггеров, как это:

create trigger dt_PolicyBenefit_OccupationalPerMilleLoadingDuration on PolicyBenefit
after insert, update as
begin
    insert into PolicyBenefitAudit
    (
        PolicyNo,
        EntityNo,
        BenefitCode,
        BenefitSequence,
        Description,
        OldValue,
        NewValue,
        CreatedBy,
        CreatedDate
    )
    select i.PolicyNo,
           i.EntityNo,
           i.BenefitCode,
           i.BenefitSequence,
           'Occupational Per Mille loading duration (in years)',
           d.OccupationalPerMilleLoadingDuration,
           i.OccupationalPerMilleLoadingDuration,
           user_name(),
           getdate()
    from   inserted i left join deleted d
    on     i.PolicyBenefitId = d.PolicyBenefitId
    where  i.OccupationalPerMilleLoadingDuration != d.OccupationalPerMilleLoadingDuration;
end
GO
0 голосов
/ 20 декабря 2018

Ошибка при передаче параметров в ваш sp:

exec dp_PolicyBenefit_audit @p_policy_id = PolicyNo, 
 @p_id = EntityNo, 
@p_benefit_cd = BenefitCode, 
@p_seq = BenefitSequence,
     @p_operation = 'UPDATE',
     @p_description = 'Occupational Per Mille loading duration (in years)',
     @p_old_value = @old_OccupationCode,
     @p_new_value = OccupationCode

Ваш @p_id объявлен как int, и вы передаете ему EntityNo (строку).По этой причине «Ошибка преобразования типа данных nvarchar в int», EntityNo - это nvarchar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...