Loading...

Łukasz Kurzyniec

Portfolio

Workstation ID i HOST_NAME

Ilość komentarzy 1
sobota, 20 marzec 2010
Kiedyś zostałem zmuszony do szybkiego, nawet bardzo szybkiego, zrealizowania zagadnienia: "archiwizacja poczynań użytkownika w systemie". Prościej rzecz ujmując, rejestracji 3 podstawowych operacji na każdej tabeli, a dokładniej jej wierszach, mianowicie: INSERT, UPDATE, DELETE. Poniżej zaprezentuję jak uporałem się z tym zagadnieniem.

Zacznę więc od początku. Workstation ID - cóż to jest takiego? Jest to jeden z wielu parametrów, który można umieścić w ConnectionString. Domyślnie przyjmuje on wartość nazwy komputera, jednakże możemy go zastąpić dowolnym ciągiem znaków (maksymalna długość to 125). Przykładowy ConnectionString wyglądałby następująco:

connectionString="Data Source=.\sqlexpress;Initial Catalog=WorkstationIdTestDB; Integrated Security=True;Workstation ID=\"flip i flap\""

Owy ciąg znaków po stronie serwera możemy wyciągnąć za pomocą wbudowanej funkcji HOST_NAME zwykłym zapytaniem: Dzięki tym dwom aspektom rejestrowałem, kto dokonywał zmiany w systemie. Z racji tego iż była to aplikacja webowa, a do komunikacji z bazą danych posługiwałem się narzędziem LINQ to SQL Classes, zmodyfikowałem lekko konstruktor do tworzenia kontekstu mojej bazy, który po modyfikacji mógłby przedstawiać się jak przykład poniżej. Nadmienię również, że konstruktor zadeklarowany był w pliku "designer.cs", należący do dbml'a.
public WorkStationIdTestDataContext() : 
	base(global::WorkstationIdTest.Properties.Settings.Default.WorkstationIdTestDBConnectionString, mappingSource)
{
	var userMS = System.Web.Security.Membership.GetUser();
	if (userMS != null)
	{
		Connection.ConnectionString += string.Format(";Workstation ID=\"{0}\"",
			userMS.ProviderUserKey.ToString());
	}
	OnCreated();
}
Od strony kodu to wszystko. Należało tylko pamiętać, iż jakakolwiek zapisana zmiana pliku dbml generowała konstruktor na nowo, co determinowało ponowne wprowadzanie zmian.

Od strony bazy było więcej pracy. Mianowicie, Microsoft SQL Server Database Publishing Wizard zeskryptował wszystkie tabele. Za pomocą magicznego [CTRL] + [H] wyszukałem "[dbo].[", a zamieniłem na "[arch].[". Usunąłem wszystkie klucze zewnętrzne i indeksy, ponieważ uznałem iż nie będą potrzebne w tabelach archiwalnych. Do każdej tabeli dołożyłem 3 nowe kolumny (ChangedBy, ChangedDate, ChangedType) oraz indeksy na dwóch pierwszych z nich. Następnie stworzyłem sobie generator triggerów, czyli funkcję której podawałem nazwę tabeli, a ta sklejała mi 3 triggery odpowiedzialne za dodawanie wierszy do tabel archiwalnych. Poniżej znajduje się przykładowe zapytanie, które dostarcza nazwy wszystkich tabel w bazie oraz jeden przykładowy trigger. Osobiście myślę, że sposób nie jest najlepszy, jednakże bardzo szybki do implementacji. Ukazuje on wykorzystanie Worksation ID w aplikacji oraz HOST_NAME w bazie danych.


Promuj


Komentarze { v0.4 }

Dodaj komentarz

Marcin Rybacki
Marcin Rybacki
{ 2010-03-27 06:38:21 }
Bardzo sprytne rozwiązanie, dzięki :)

Zastanawiałem się po jakie licho to Workstation ID jest w connection string ;)