Jak sprawdzić która kolumna została zmieniona

0

Witam,

Mam tabelkę, gdzie zapisuję zmiany dokonane na konkretnym rekordzie w tabeli.

Czyli np. dla Klientów w dużym uproszczeniu tabela wygląda tak:
title

Czy ma ktoś pomysł w jaki najprostszy sposób mogę sprawdzić, które pole zostało zmienione ( w tym przypadku "Name"). Sprawdzałem coś takiego jak COLUMNS_UPDATED(), ale nie wiem czy to jest odpowiedni kierunek

1

Szukałem dziś coś podobnego ... i trafiłem na coś takiego ... nie sprawdzałem nie tykałem jeszcze kwestii (ja potrzebuje czegoś innego ... zoptymalizowanego wyszukiwania różnic bo mój kod się okazuje, że klęka przy większej ilości ;/) anyway... może Ci się przyda:

https://asktom.oracle.com/pls/apex/f%3Fp%3D100:11:0::::P11_QUESTION_ID:1004115105172

1

COLUMNS_UPDATED jak i zresztą UPDATED powie Ci, że kolumna została zmieniona także w sytuacji, gdy zostanie w nią wstawiona ta sama wartość, która była w niej poprzednio. No i staraj sie nie iść w zwalanie roboty na triggery. Staraj się w ogóle nie stosować triggerów, Przynajmniej na początku tworzenia aplikacji. Jak aplikacja się rozrośnie, to stracisz nad tym kontrolę. Przestaniesz obejmować. Dziś nawet nie spodziewasz się, jak szybko to może nastąpić.

1
pitcairn1987 napisał(a):

COLUMNS_UPDATED(), ale nie wiem czy to jest odpowiedni kierunek

Tak, to jest odpowiedni kierunek.

0

Ok po długich kombinacjach udało mi się uzyskać dokładnie to o co mi chodziło (z użyciem UNPIVOT):

--TWORZYMY SOBIE TABELKĘ  Z REJESTREM ZMIAN DO TESTÓW

create table #Customers
(
	CustomerID  int
	,EmployeeID int
	,Name varchar(max)
	,Code varchar(max)
	,ChangeDate date
)


INSERT INTO #Customers (CustomerID,Employeeid,Name, Code, ChangeDate)
VALUES(1,4,'ABC','5052','2017-02-01')

INSERT INTO #Customers (CustomerID,Employeeid,Name, Code, ChangeDate)
VALUES(1,4,'ABC','5111','2017-02-02')

INSERT INTO #Customers (CustomerID,Employeeid,Name, Code, ChangeDate)
VALUES(1,4,'ABC','5111','2017-02-03')

INSERT INTO #Customers (CustomerID,Employeeid,Name, Code, ChangeDate)
VALUES(1,4,'TESCO','1234','2017-02-04')






--WŁAŚCIWE ZAPYTANIE


--do 1 tabelki tymczasowej zapisuje sobie wartośći po ostatniej operacji, czyli aktualne
select 
f.CustomerID as CustomerID
,cast(f.EmployeeID as VARCHAR(MAX)) as EmployeeID
,f.Name as Name
,Code as Code
into #temp1 from 

(
		select
		*
		,ROW_NUMBER() OVER(PARTITION by CustomerID   ORDER by ChangeDate desc) as rownum
		 from #Customers
)
as f
where f.rownum = 1
order by f.CustomerID,f.rownum


--do 2 tabelki tymczasowej zapisuje sobie wartości sprzed ostatniej zmiany
select 
f.CustomerID as CustomerID
,cast(f.EmployeeID as VARCHAR(MAX)) as EmployeeID
,f.Name as Name
,Code as Code
into #temp2 from 

(
		select
		*
		,ROW_NUMBER() OVER(PARTITION by CustomerID   ORDER by ChangeDate desc) as rownum
		 from #Customers
)
as f
where f.rownum = 2
order by f.CustomerID,f.rownum


-- unpivotuje obie tabelki, odejmuje od siebie i wychodzą mi tylko kolumny, które się róznią. Tabelka pokazuje mi wartości sprzed ostatniej zmiany
SELECT f.* FROM 

(

 select CustomerID, Field, LastValue
 from
 (

	 select CustomerID, Code, Name, EmployeeID
	 from #temp2
	 ) p
 UNPIVOT(LastValue for Field in (EmployeeID, Name, Code)) as upvt

EXCEPT


select CustomerID, Field, LastValue
 from
 (

	 select CustomerID, Code, Name, EmployeeID
	 from #temp1
	 ) p
 UNPIVOT(LastValue for Field in (EmployeeID, Name, Code)) as upvt

) f 


WHERE F.CustomerID = 1



DROP TABLE #temp1, #temp2
DROP TABLE #Customers

1 użytkowników online, w tym zalogowanych: 0, gości: 1