22 października 2011

Wymienię IF/EXISTS/SELECT/UPDATE/INSERT na MERGE

Ignorancja to słabość


Ostatnio przeglądałem T-SQL kod w którym została użyta pewna siermiężna acz użyteczna konstrukcja (użyteczna w poprzednich wersjach SQL Server'a, tak od 2005 w dół). Zapytałem się autora kodu, czy przypadkiem nie używają MS SQL Server 2008, otrzymałem pozytywną odpowiedź "nawet w wersji R2". Kod który prezentuje ogólny zarys problemu znajduje się poniżej. Przykłądowa implementacja wstawia rekord do tabeli jeśli jeszcze on nie istnieje, w innym wypadku aktualizuje wartości wybranych kolumn przy pomocy UPDATE'u.

IF EXISTS(SELECT * FROM Table1 WHERE Id = @Id)
BEGIN
  INSERT INTO Table1(Id, Name) VALUES(@Id, @Name)
END
ELSE
BEGIN
  UPDATE Table1
     SET Name = @Name
   WHERE Id = @Id
END

Niestety i na szczęście każde triki, schematy ulegają w końcu przedawnieniu. I tak się stało z powyższym IF/EXISTS/SELECT/UPDATE/INSERT.

20 października 2011

Linked Server w SQL Server dla początkujących

Linked Server jako dobry wujek


Linked Server w SQL Serwerze oferuje prosty mechanizm udostępnienia danych ze zdalnego serwera (MS SQL Server, Oracle, DB2, itd). Z mojego doświadczenia wyniki, że jest to jeden z bardziej nadużywanych komponentów MS SQL Server'a. Korzystanie z Linked Server'ów jest na tyle proste, że większość systemów opartych na silniku baz danych MSSQL używa ich do przesyłania danych pomiędzy systemami.

Łatwość używania Linked Server'ów spowodowała, że stały się one jakby "standardem" wykorzystywanym do "integracji" systemów. W przypadku jednorazowego przesłania pewnej ilości danych użycie Linked Server'a jest jak najbardziej zrozumiałe. Jednak tworzenie w ten sposób rozwiązania integrującego np. dwa kluczowe systemy w firmie jest dla mnie pewnym nieporozumieniem.

Często połączenie dwóch systemów zaczyna się jako niewinne udostępnienie jednego widoku, tak na próbę. Po jakims czasie zaczynamy zaciągać kolejne tabele, nawet wykonywać złożone zapytania z JOIN'ami pomiędzy widokami/tableami zdalnymi i lokalnymi. Apogeum takiej sytuacji jest udostępnianie procedur składowanych wywoływanych przez zewnętrzne systemy.

17 października 2011

Obudziłem się z ręką w piaskownicy SharePoint'a

Kontakty trzeciego stopnia z Sandbox Solutions


Microsoft w SharePoint 2010 zaproponował nowy sposób wdrażania i uruchamiania komponentów SharePoint'a, który nazywa się Sandbox Solutions (z angielskiego Sandbox to piaskownica). Sandbox Solutions są to "normalne" pliki CAB z rozszerzeniem .wsp, tak jak stare dobre Farm Solutions. Zasadnicza różnica polega na tym, że Sandbox Solutions (SS) mogą być wdrażane na poziomie Site Collection i na poziomie farmy, a Farm Solutions mogą być wdrażane tylko na poziomie farmy SharePoint'a. Docelowo najbardziej pożądanym miejscem dla  SS jest Site Collection.

SharePoint udostępnia oddzielne środowisko uruchomieniowe dla kodu z Sandbox Solutions w postaci oddzielnego procesu (Sandbox Worker Process). Całe środowisko jest tak skonstruowane, że udostępnia tylko część SharePoint API do którego ograniczono dostęp poprzez wprowadzenie Sandbox Proxy Worker Process.  Sandbox Woker Process komunikuje się z Proxy w momencie gdy chce wywołać jakąś metodę lub klasę z Microsoft.SharePoint.dll.  Ładny obrazek architektury SS można zobaczyć tutaj.

Taka architektura ma swoje następstwa. Ograniczono możliwość korzystania praktycznie ze wszystkich pozostały bibliotek SharePoint'a. Powód tego jest prostym, często wymagają one dostępu poza Site Collection np. do Web Application i jest to sprzeczne z architekturą Piaskownicy.

04 października 2011

Przygód kilka Pana NULL'a

Znam się z NULL'em od lat


Oglądając materiały z Introduction to Databases, przypomniały mi się koszmary z dzieciństwa.  Zdarzyło mi się wspierać jako programista bądź inżynier support'u kilka systemów używających MS SQL Server'a (każdy z nich był rozwijany przynajmniej 5 lat). Miały one kilka cech wspólnych , jedna z nich sprawiła mi sporo problemów przy rozwijaniu i utrzymywaniu tych systemów. Posiadały one dużo tabel w których definicje kolumn umożliwiały wstawianie wartości NULL. Poniższa definicja tabeli FooTable prezetuje ten sposób definiowania kolumn.

CREATE TABLE FooTable(
....
FooName VARCHAR(20) NULL
....
)

Ogólnie zachęcam do definiowania explicite czy dana kolumna w tabeli jest NULL czy NOT NULL, ale wracając do tematu. W tym poście chciałbym podsumować w kilku słowach konsekwencje jakie niesie ze sobą tworzenie dużej ilości kolumn z możliwością wstawienia NULL'a. Moim celem jest przekonanie szanownego czytelnika do prostej zasady, która brzmi następująco.
Jeżeli ktoś nie przystawia wam towarzyszu "pistoletu do głowy" to proszę nie definiujcie kolumn, które umożliwiają wstawianie wartości NULL. Używajcie wartości domyślnych, stałych wartości lub pustych ciągów znakowych. 

03 października 2011

Triumwirat czyli podatki, dynamic i tuple

Progresywny podatek dochodowy w Izraelu


Zbliżają się wybory, zatem podatki to teraz gorący temat. Tak się złożyło, że Ayende Rahien na swoim blogu opublikował jedno z zadań rekrutacyjnych, które wykorzystywał do weryfikacji umiejętności potencjalnych kandydatów na programistę. Problem polegał na obliczeniu podatku dochodowego od danej kwoty, zakładając, że stawki podatku  i progi podatkowe w Izraelu są następujące.


Progi podatkowe Podatek
do kwoty 5,070 ILS 10%
od 5,071  do 8,660  14%
od 8,661 do 14,070 23%
od 14,071 do 21,240 30%
od 21,241 do 40,230 33%
powyżej 40,230 45%

Przykładowe odpowiedzi:

  • 5,000  ILS –> 500
  • 5,800  ILS –> 609.2
  • 9,000   ILS –> 1087.8
  • 15,000  ILS –> 2532.9
  • 50,000  ILS –> 15,068.1