Herausfinden, welche Spalten sich geändert haben von einem Eintrag zum nächsten

SilentWarrior

Erfahrenes Mitglied
Hallo zusammen,

Ich stehe vor einem Problem, bei dem meine mittelmässigen SQL-Kenntnisse leider nicht mehr ausreichen.

Die Situation: Es gibt eine Tabelle UR_USER sowie eine Tabelle UH_USER_HISTORY. Jedesmal, wenn eine Zeile z in UR_USER upgedated oder neu eingefügt wird, wird in UH_USER_HISTORY eine Kopie von z abgelegt.

Jetzt möchte ich gerne UH_USER_HISTORY traversieren und herausfinden, welche Daten sich im Vergleich zum vorherigen Eintrag eines Benutzers geändert haben (also z.B. Vorname, Nachname usw.)

Hier der PHP-Code, der das erledigt (propelbasiert):

PHP:
foreach (UhUserHistoryPeer::doSelect(new Criteria) as $event)
	{
		$c = new Criteria();
		$c->add(UhUserHistoryPeer::UR_ID, $event->getUrId());
		$c->add(UhUserHistoryPeer::CREATED_AT, $event->getCreatedAt(), Criteria::LESS_THAN);
		$c->addDescendingOrderByColumn(UhUserHistoryPeer::CREATED_AT);
		$prev = UhUserHistoryPeer::doSelectOne($c);

		$changes = array();

		if ($event->getUhUsername() != $prev->getUhUsername()) $changes['username'] = $event->getUhUsername();
		if ($event->getUhFirstName() != $prev->getUhFirstName()) $changes['first_name'] = $event->getUhFirstName();
		if ($event->getUhLastName() != $prev->getUhLastName()) $changes['last_name'] = $event->getUhLastName();
		if ($event->getUhEmail() != $prev->getUhEmail()) $changes['e-mail_address'] = $event->getUhEmail();
		if ($event->getUhSite() != $prev->getUhSite()) $changes['site'] = $event->getUhSite();
		if ($event->getUhStatus() != $prev->getUhStatus()) $changes['status'] = $event->getUhStatus();

		if (empty($changes)) continue;

		$tmp['username'] = $event->getUsername();
		$tmp['createdat'] = $event->getCreatedAt('U');
		$tmp['description'] = 'The following was changed:<ul>';
		foreach ($changes as $k => $change)
		{
			if ($k == 'status')
			{
				$change = sfConfig::get("app_userstatus_$change");
			}
			$tmp['description'] .= '<li>'.str_replace('_', ' ', ucfirst($k)).' was set to '.$change.'</li>';
		}
		$tmp['description'] .= '</ul>';
		$tmp['triggeredby'] = '';
		$this->history[] = $tmp;
	}

Es geht um die sechs Zeilen in der Mitte (die mit den ifs). Wie kann ich sowas in SQL umsetzen? Ich möchte eine View basteln und habe folgenden Query:

Code:
SELECT
	UR_USER.UR_ID AS ID,
	UR_USER.CREATED_AT AS CREATED_AT,
	'The following was changed:<ul>?</ul>' AS EVENT,
	'' AS TRIGGERED_BY
FROM
	UR_USER
WHERE
	?

Kann mir jemand dabei helfen und mir sagen, was bei den beiden roten Fragezeichen reinkommt? Oder geht mein Vorhaben mit reinem SQL überhaupt nicht?

Vielen Dank für Hilfe und Gruss,

SilentWarrior
 
Hi

Wieso machst du das ganze nicht per Trigger auf Datenbankebene?
Ist der Trigger für Before Insert (update) erstellt, kannst du dir den alten Datensatz geben lassen und vergleichen, was sich geändert hat.
selbiges gilt bei neuen Datensätzen. Wird ein neuer Datensatz erstellt, legst du in der Historie Tabelle den Datensatz auch mit an.
 
Wieso machst du das ganze nicht per Trigger auf Datenbankebene?

Mach ich ja: Ich hab einen (bzw. zwei, einen für INSERT und einen für UPDATE) auf UH_USER_HISTORY:

Jedesmal, wenn eine Zeile z in UR_USER upgedated oder neu eingefügt wird, wird in UH_USER_HISTORY eine Kopie von z abgelegt.

Ist der Trigger für Before Insert (update) erstellt, kannst du dir den alten Datensatz geben lassen und vergleichen, was sich geändert hat.
Hm … und was bringt mir das? Ich meine, wo kann ich dann die Informationen speichern, welche Spalten sich geändert haben?
 

Neue Beiträge

Zurück