Also grundsätzlich erstmal ja, jede Tabelle, in der eine Spalte dauerhaft auf NULL gehalten werden soll, braucht einen Trigger. Der muss natürlich auch die konkrete Tabellen- und Spaltenbezeichnungen enthalten, soweit klar.
INSTEAD OF INSERT, UPDATE feuert dann den Code des Triggers bei jedem INSERT oder UPDATE anstelle der eigentlichen INSERT oder UPDATE-Anweisung. In dem Moment, wo der Trigger feuert (ausgelöst wird), stehen die kompletten Datensätze, die INSERT oder UPDATE liefern in der (System-)Tabelle INSERTED (die heißt so, bei MySQL ist das NEW). INSERTED beinhaltet also in dem Moment das, was eigentlich in die Tabelle soll.
Alles was durch UPDATE überschrieben wird oder was durch ein DELETE gelöscht wird, steht in der Tabelle DELETED. Anstatt jetzt zuzulassen das die Daten aus INSERTED in die Tabelle gelangen und die Daten in DELETED aus der Tabelle entfernt werden findet jetzt also das statt, was im Trigger steht. Wichtig ist auch: Der Trigger wird mit einem Update-Befehl einmal ausgelöst, nicht für jede Zeile. Betrifft das Update 1000 Zeilen stehen auch 1000 Zeilen in INSERTED und der Trigger wird einmal abgefeuert. Er muss also logischerweise alles aus INSERTED berücksichtigen.
Ich mache jetzt nichts anderes als alle Datensätze aus INSERTED in die Zieltabelle zu schreiben aber nur solche, die ich mit keinem Datensatz in DELETED joinen kann (natürlich über den Primärschlüssel). Das heißt es sind zwingend nur komplett neue Datensätze betroffen, keine Aktualisierungen denn dann gäbe es einen Eintrag in DELETED dazu.
Der Insert reicht die Daten 1:1 weiter bis auf die Spalte, die du nullen willst. Diese Information steht zwar in INSERTED, wird aber nie in die Zieltabelle geschrieben.
Im Anschluss joine ich Alles, was auch einen Eintrag in DELETED hat (INNER JOIN macht das zwingend notwendig), wo es also schon einen Datensatz mit dem Primärschlüssel gibt. Die Logik ist die selbe, diese Datensätze entstammen alle einem Update, ich führe jetzt also nicht den Insert sondern das Update auf die Zieltabelle aus selbst aus. Auch hier müssen alle Spalten rein und nur die, die genullt werden soll, wird nicht befüllt. Man könnte sie auch aus dem Update-Statement weg lassen, die steht da nur der Vollständigkeit halber.
In deinem Code gibt es direkt einen Fehler[CODE]INSERT INTO [DB_TEST].[dbo].[Tab_01](PK,NULL,Col_02,NULL,Col_04,Col_05,Col_nn)[/CODE]
In der Werteliste, die alle Spalten der Zieltabelle enthällt die befüllt werden sollen, fehlt die Spalte die mit NULL befüllt wird. In der Werteliste muss die Spalte genannt werden, in den Datensätzen muss dann NULL als Wert stehen. Auch hier kann man die Spalte auch komplett weg lassen, also sowohl in der Spaltenliste als auch im Select auf INSERTED.