sql >> Databasteknik >  >> RDS >> Sqlserver

Den mest effektiva metoden för att upptäcka kolumnändring i MS SQL Server

Låt oss börja med jag skulle aldrig och jag menar aldrig anropa en lagrad proc i en trigger. För att ta hänsyn till en infogning av flera rader måste du gå igenom proc. Detta innebär att de 200 000 raderna du just laddade genom en uppsättningsbaserad fråga (säg att uppdatera alla priser med 10%) kan mycket väl låsa tabellen i timmar eftersom utlösaren tappert försöker hantera belastningen. Plus om något förändras i processen, kan du bryta alla insatser till bordet alls eller till och med hänga upp bordet helt. Jag är övertygad om att triggerkoden inte borde anropa något annat utanför triggern.

Personligen föredrar jag att helt enkelt göra min uppgift. Om jag har skrivit de åtgärder jag vill göra ordentligt i triggern kommer den bara att uppdatera, radera eller infoga där kolumner har ändrats.

Exempel:anta att du vill uppdatera efternamnsfältet som du lagrar på två ställen på grund av en denormalisering placerad där av prestandaskäl.

update t
set lname = i.lname
from table2 t 
join inserted i on t.fkfield = i.pkfield
where t.lname <>i.lname

Som du kan se skulle det bara uppdatera de lnamn som är annorlunda än vad som för närvarande finns i tabellen jag uppdaterar.

Om du vill göra granskning och bara registrera de rader som ändrats, gör jämförelsen med alla fält ungefär där i.field1 <> d.field1 eller i.field2 <> d.field3 (etc genom alla fält)



  1. WordPress-fråga:Sortera efter antal matchade rader?

  2. Hur skriver man en mallförfrågan i viloläge från sql-frågan?

  3. Mitt webbhotell säger att det är något fel med PHP-kod

  4. Finns det några gratisverktyg för att generera 'INSERT INTO'-skript i MS SQL Server?