Jak sprawdzić która kolumna została zmieniona

Jak sprawdzić która kolumna została zmieniona
P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 77
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

BlackBad
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 454
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

  • Rejestracja: dni
  • Ostatnio: dni
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ć.

Haskell
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4700
1
pitcairn1987 napisał(a):

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

Tak, to jest odpowiedni kierunek.

P1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 77
0

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

Kopiuj
--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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.