2013-11-07 3 views
0

У меня есть таблица (Equip, которая вставлена), которая имеет триггер, который обновляет другую таблицу (asset_tracker.dbo.EIS_JobAssetMaint) с данными. Если я вручную обновляю данные в Equip через SSMS, триггер правильно обновит колонки Maxtemp и RunHrs в asset_tracker.dbo.EIS_JobAssetMaint.SQL Server запускает частично обновление из Linq To Sql code

Если я редактировать Equip через Linq To Sql кода в C#, Equip обновляется, но asset_tracker.dbo.EIS_JobAssetMaint лишь частично обновляется из триггера.

т.е. данные в Equip правильно, но 2 из колонн, Maxtemp и Runtime, не получают переносится на asset_tracker.dbo.EIS_JobAssetMaint колонн, Maxtemp и RunHrs

Вот триггер:

ALTER TRIGGER [dbo].[Eis_JobAssetMaint_trigger_new] 
ON [dbo].[Equip] 
For INSERT, UPDATE 
AS 



BEGIN 
    SET NOCOUNT ON 

    DECLARE @runhrsDiff float, 
      @jobID int, 
      @partno varchar(20), 
      @assetno varchar(36), 
      @maxtemp float, 
      @runtime float, 
      @assetID int 


    SELECT @jobID = (Select JobID from inserted), 
      @partno = (Select Part_No from inserted), 
      @assetno = (Select Asset_No from inserted), 
      @maxtemp = (Select MaxTemp from inserted), 
      @runtime = (Select RunTime from inserted) 

    SELECT @runhrsDiff = t2.runtime - t1.Runhrs FROM asset_tracker.dbo.EIS_JobAssetMaint AS t1 INNER JOIN INSERTED AS t2 
    ON t1.Part_No = t2.part_no AND t1.Asset_No = t2.asset_no AND t1.jobid = t2.jobid 


      IF Exists (Select t1.jobid,t1.Asset_No,t1.Part_No from asset_tracker.dbo.Eis_jobassetmaint as t1 
         inner join Inserted T2 on T1.Jobid = T2.jobid and T1.Part_no = T2.Part_no and T1.Asset_No = T2.Asset_no) 

       Begin 

        UPDATE t10 SET t10.RunHrs = [email protected] 
        , t10.maxt = CASE WHEN t12.maxtemp > t10.maxt then t12.maxtemp ELSE t10.maxt END 
        from asset_tracker.dbo.EIS_repairlog_maint as t10 
        INNER JOIN asset_tracker.dbo.eis_repairlog as t11 ON t10.repair_number = t11.repair_number AND t11.repair_status IN (1,4,6,7) AND t11.repair_type IN (13,14,15) 
        INNER JOIN INSERTED AS t12 ON t12.part_no = t11.part_number AND t12.asset_no = t11.asset_number 


        Update T1 set T1.RunHrs = T2.Runtime , T1.MaxTemp = T2.MaxTemp 
        From Inserted as T2 inner join asset_tracker.dbo.Eis_JobAssetMaint as T1 
        on T2.Jobid = T1.jobid and T2.Part_no = T1.Part_no and T2.Asset_No = T1.Asset_no 
       End 
      Else 

       BEGIN TRY 
        ----------------- new line 
        UPDATE t10 SET t10.RunHrs = t10.Runhrs + t12.runtime 
        , t10.maxt = CASE WHEN t12.maxtemp > t10.maxt then t12.maxtemp ELSE t10.maxt END 
          from asset_tracker.dbo.EIS_repairlog_maint as t10 
          INNER JOIN asset_tracker.dbo.eis_repairlog as t11 ON t10.repair_number = t11.repair_number AND t11.repair_status IN (1,4,6,7) 
          INNER JOIN INSERTED AS t12 ON t12.part_no = t11.part_number AND t12.asset_no = t11.asset_number 




        IF EXISTS (SELECT t1.Assetname, t1.Part_No from asset_tracker.dbo.AssetPositions as t1 
           inner join Inserted as t2 on T1.Part_no = T2.Part_no and T1.Assetname = T2.asset_no) 
         IF NOT Exists (Select t1.jobid,t1.Asset_No,t1.Part_No from asset_tracker.dbo.Eis_jobassetmaint as t1 
           inner join Inserted T2 on T1.Jobid = T2.jobid and T1.Part_no = T2.Part_no and T1.Asset_No = T2.Asset_no) 
          BEGIN 
           PRINT ('Attempting to insert new record into JobAssetMaint') 
           Insert into asset_tracker.dbo.Eis_JobAssetMaint 
            ( Jobid 
             ,Part_no 
             ,Asset_no 
             ,MaxTemp 
             ,MaxTempIgnore 
             ,RunHrs 
             ,RunHrsIgnore 
             ,jobcnt 
             ,JobCntIgnore 
             ,MaxShock 
             ,MaxShockIgnore 
             ,LastUpdated 
            ) 
            VALUES (@jobID, 
              @partno, 
              @assetno, 
              @maxtemp, 
              0, 
              @runtime, 
              0, 
              1, 
              0, 
              0, 
              0, 
              getdate() 
              ) 

            --From inserted 
          END 
       END Try 

      BEGIN CATCH 

       --Declare @jobid int 
       select @jobid = jobid from inserted 
         RAISERROR (N'The INSERT statement conflicted with the FOREIGN KEY constraint "FK_EIS_JobAssetMaint 2_AssetPositions". The conflict occurred in database "asset_tracker", table "dbo.AssetPositions".The current JOBID is:%d ',10, 1,@jobid); 
      END CATCH 



END 

Надеюсь, это не слишком смущает. Если да, то дайте мне знать.

+1

Хорошо, во-первых, ваш спусковой крючок плох, даже если вы считаете, что это сработало. Его нужно переписать с нуля, так как вы никогда не устанавливаете значения, вставленные в скалярную переменную. Вставка может содержать несколько строк, и вам нужно убедиться, что это триггер. Сделать anythign еще безответственно. – HLGEM

+0

мы это понимаем. Раньше у нас не было переменных. Это было то, что мы пробовали для устранения неполадок. –

+1

Я предполагаю, что проблема, вероятно, связана с вышеизложенным. Я бы предложил изменить присвоение соответствующих переменных «SELECT TOP 1 MaxTemp FROM Inserted» –

ответ

0

Вот мой намек на сложные триггеры troubshooting. Выньте создающую триггерную часть и измените вставку или удаление (или оба) в временные таблицы с именем #inserted или #deleted. Перед запуском сценария развертывания создайте таблицу #inserted и заполните ее тестовыми данными, которые соответствуют возможностям, которые вам нужно проверить. Теперь вы можете немного запустить остальную часть скрипта и посмотреть значения вещей, которые вы пытаетесь найти с помощью тестового кода. После того, как вы закончите, удалите тестовый код, измените # вставленный обратно на вставленный и поместите inteh, создайте или измените триггерные части.

Смежные вопросы