sobota, 29 grudnia 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - zadanie For Loop Container

Dzisiaj publikuję kolejne nagranie z cyklu "SQL Server Integration Services (SSIS) w praktyce". Tym razem, przedstawiam zagadnienia dotyczące wykorzystania zadania For Loop Container.


sobota, 22 grudnia 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - wymiana danych z serwerem FTP

Dzisiaj publikuję kolejne nagranie z cyklu "SQL Server Integration Services (SSIS) w praktyce". Tym razem, przedstawiam zagadnienia dotyczące wykorzystania zadania FTP na zakładce Control Flow w SSDT celem wymiany danych z serwerem FTP.


sobota, 15 grudnia 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - zadanie Row Count

Dzisiaj publikuję kolejne nagranie z cyklu "SQL Server Integration Services (SSIS) w praktyce". Tym razem, przedstawiam zagadnienia dotyczące wykorzystania zadania Row Count.


sobota, 8 grudnia 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - transformacje Row Sampling i Percentage Sampling

Dzisiaj publikuję kolejne nagranie z cyklu "SQL Server Integration Services (SSIS) w praktyce". Tym razem, przedstawiam zagadnienia dotyczące wykorzystania transformacji Row Sampling oraz Percentage Sampling.


sobota, 1 grudnia 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - transformacja Conditional Split

Dzisiaj publikuję kolejne nagranie z cyklu "SQL Server Integration Services (SSIS) w praktyce". Tym razem, przedstawiam zagadnienia dotyczące wykorzystania transformacji Conditional Split.


sobota, 24 listopada 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - procedury składowane dotyczące folderów

SQL Server Integration Services zawiera kilka procedur składowanych, które pozwalają na zarządzanie folderami w katalogu SSIS. Poniżej przykład.

-- sprawdzamy jakie foldery aktualnie istnieją
select * from [catalog].[folders]

-- tworzymy nowy folder o nazwie test2018_11_24
exec [catalog].[create_folder] @folder_name = test2018_11_24

-- sprawdzamy jakie foldery aktualnie istnieją
select * from [catalog].[folders]

-- ustawiamy właściwość DESCRIPTION folderu o nazwie test2018_11_24
exec [catalog].[set_folder_description] @folder_name = test2018_11_24,
@folder_description = 'to jest testowy opis'

-- sprawdzamy jakie foldery aktualnie istnieją i wyświetlamy ich właściwości
select * from [catalog].[folders]

-- zmieniamy nazwę folderu test2018_11_24 na test2018_11_24_nowa
exec [catalog].[rename_folder] @old_name = test2018_11_24, 
@new_name = test2018_11_24_nowa

-- sprawdzamy jakie foldery aktualnie istnieją i wyświetlamy ich właściwości
select * from [catalog].[folders]

-- usuwamy folder o nazwie test2018_11_24_nowa
exec [catalog].[delete_folder] @folder_name = test2018_11_24_nowa

-- sprawdzamy jakie foldery aktualnie istnieją i wyświetlamy ich właściwości
select * from [catalog].[folders]


sobota, 17 listopada 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - SCD typu 1 i 2

Dzisiaj publikuję kolejne nagranie z cyklu "SQL Server Integration Services (SSIS) w praktyce". Tym razem, przedstawiam zagadnienia dotyczące wykorzystania Slowly Changing Dimensions (SCDs) typu 1 i 2.


sobota, 10 listopada 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - zadanie OLE DB Command

Dzisiaj publikuję kolejne nagranie z cyklu "SQL Server Integration Services (SSIS) w praktyce". Tym razem, przedstawiam zagadnienia dotyczące wykorzystania zadania OLE DB Command.



sobota, 3 listopada 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - transformacja Copy Column

Dzisiaj publikuję kolejne nagranie z cyklu "SQL Server Integration Services (SSIS) w praktyce". Tym razem, przedstawiam zagadnienia dotyczące wykorzystania transformacji Copy Column.


sobota, 27 października 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - transformacja Multicast

Dzisiaj publikuję kolejne nagranie z cyklu "SQL Server Integration Services (SSIS) w praktyce". Tym razem, przedstawiam zagadnienia dotyczące wykorzystania transformacji Multicast.

 

sobota, 20 października 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - transformacja Merge Join

Dzisiaj publikuję kolejne nagranie z cyklu "SQL Server Integration Services (SSIS) w praktyce". Tym razem, przedstawiam zagadnienia dotyczące wykorzystania transformacji Merge Join.

sobota, 13 października 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - transformacja Lookup

Dzisiaj publikuję kolejne nagranie z cyklu "SQL Server Integration Services (SSIS) w praktyce". Tym razem, przedstawiam zagadnienia dotyczące wykorzystania transformacji Lookup.

niedziela, 7 października 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - transformacja Derived Column

Dzisiaj publikuję kolejne nagranie z cyklu "SQL Server Integration Services (SSIS) w praktyce". Tym razem, przedstawiam zagadnienia dotyczące wykorzystania transformacji Derived Column.

sobota, 29 września 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - transformacja Import i Export column

Dzisiaj publikuję kolejne nagranie z cyklu "SQL Server Integration Services (SSIS) w praktyce". Tym razem, przedstawiam zagadnienia dotyczące wykorzystania transformacji Data Conversion.

sobota, 22 września 2018

[EN] Setup Failed while SSDT installation - how solve this problem?

Recently, when I try did install SSDT for Visual Studio 2015 on Windows Server 2016, I did  have problem that appear error screen with description "Setup Failed" and following error messages in log file:

 [12AC:0C58][2018-09-08T23:48:58]: Error 0x80072f08: Failed to send request to URL: https://go.microsoft.com/fwlink/?LinkId=832089&clcid=0x409
[12AC:0C58][2018-09-08T23:48:58]: Error 0x80072f08: Failed to send request to URL: https://go.microsoft.com/fwlink/?LinkId=832089&clcid=0x409
[12AC:0C58][2018-09-08T23:48:58]: Error 0x80072f08: Failed to connect to URL: https://go.microsoft.com/fwlink/?LinkId=832089&clcid=0x409
[12AC:0C58][2018-09-08T23:48:58]: Error 0x80072f08: Failed to get size and time for URL: https://go.microsoft.com/fwlink/?LinkId=832089&clcid=0x409
[12AC:0C58][2018-09-08T23:48:58]: Error 0x80072f08: Failed attempt to download URL: 'https://go.microsoft.com/fwlink/?LinkId=832089&clcid=0x409' to: 'C:\Users\ADMINI~1\AppData\Local\Temp\2\{f3809ec7-e8e2-4989-98a4-0f68d25f7568}\VSTALS2015'



Cause of problem was Internet Explorer Enhanced Security Configuration (IE ESC)After temporary disable IE ESC in Server Manager setting, SSDT was install without errors.

niedziela, 16 września 2018

[EN] SQL Server 2016 SP2 / SSDT 2015 - why Azure group is greyed out?

If we have environment, in which are SQL Server 2016 SP2 and SQL Server Data Tools 2015 and after install Azure Feature Pack for Integration Services (SSIS), the Azure group is disabled in the SSIS Toolbox, then we should change value of TargetServerVersion parameter into SQL Server 2016 in the properties of the our SSIS project.



sobota, 8 września 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - zmienne

Dzisiaj publikuję kolejne nagranie z cyklu "SQL Server Integration Services (SSIS) w praktyce". Tym razem, przedstawiam zagadnienia dotyczące wykorzystania zmiennych

niedziela, 2 września 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - transformacje Union All oraz Merge

Dzisiaj publikuję kolejne nagranie z cyklu "SQL Server Integration Services (SSIS) w praktyce". Tym razem, przedstawiam zagadnienia dotyczące wykorzystania transformacji Union All oraz Merge.


sobota, 25 sierpnia 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - transformacja Fuzzy Grouping

Dzisiaj publikuję kolejne nagranie z cyklu "SQL Server Integration Services (SSIS) w praktyce". Tym razem, przedstawiam zagadnienia dotyczące wykorzystania transformacji Fuzzy Grouping. 


sobota, 18 sierpnia 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - transformacja Fuzzy Lookup

Dzisiaj publikuję kolejne nagranie z cyklu "SQL Server Integration Services (SSIS) w praktyce". Tym razem, przedstawiam zagadnienia dotyczące wykorzystania transformacji Fuzzy Lookup. 



Kod wykorzystany podczas nagrania:

create database [test_fuzzy_lookup]
go
 
use  [test_fuzzy_lookup]
go
 
create table [dbo].[Mieszkancy] (
Id int,
imie varchar(255),
nazwisko varchar(255),
miejscowosc varchar(255),
ulica varchar(255)
);
 
 
create table [dbo].[SlownikUlicBialystok] (
NazwaUlicy varchar(255)
);
 
 
insert into [dbo].[SlownikUlicBialystok] (NazwaUlicy) 
 values ('Jana Klemensa Branickiego');
insert into [dbo].[SlownikUlicBialystok] (NazwaUlicy) 
 values ('Elizy Orzeszkowej');
insert into [dbo].[SlownikUlicBialystok] (NazwaUlicy) 
 values ('Piastowska');
 
insert into [dbo].[Mieszkancy] (Id, imie, nazwisko, miejscowosc, ulica) 
 values (1, 'Jan', 'Kowalski', 'Białystok', 'Branickiego');
insert into [dbo].[Mieszkancy] (Id, imie, nazwisko, miejscowosc, ulica) 
 values (2, 'Jan', 'Nowak', 'Białystok', 'J.K Branickiego'); 
insert into [dbo].[Mieszkancy] (Id, imie, nazwisko, miejscowosc, ulica) 
 values (3, 'Jan', 'Wiśniewski', 'Białystok', 'J.K Branickiego');
insert into [dbo].[Mieszkancy] (Id, imie, nazwisko, miejscowosc, ulica) 
 values (4, 'Jan', 'Kwiatkowski', 'Białystok', 'Orzeszkowej');
insert into [dbo].[Mieszkancy] (Id, imie, nazwisko, miejscowosc, ulica) 
 values (5, 'Jan', 'Kozłowski', 'Białystok', 'Elizy Orzeszkowej');
insert into [dbo].[Mieszkancy] (Id, imie, nazwisko, miejscowosc, ulica) 
 values (6, 'Jan', 'Mazur', 'Białystok', 'E.Orzeszkowej');
insert into [dbo].[Mieszkancy] (Id, imie, nazwisko, miejscowosc, ulica) 
 values (7, 'Jan', 'Kamiński', 'Białystok', 'E Orzeszkowej');
insert into [dbo].[Mieszkancy] (Id, imie, nazwisko, miejscowosc, ulica) 
 values (8, 'Jan', 'Krawczyk', 'Białystok', 'Piastowska');
insert into [dbo].[Mieszkancy] (Id, imie, nazwisko, miejscowosc, ulica) 
 values (9, 'Jan', 'Kaczmarek', 'Białystok', 'Branickieg');
insert into [dbo].[Mieszkancy] (Id, imie, nazwisko, miejscowosc, ulica) 
 values (10, 'Jan', 'Dąbrowski', 'Białystok', 'Jana Klemensa Branickiego');
 
select * from [dbo].[SlownikUlicBialystok]
 
select * from [dbo].[Mieszkancy] 
select * from [OLE DB Destination]
 
delete from [OLE DB Destination]
 
select 
Id, 
imie, 
nazwisko, 
miejscowosc, 
ulica 
from [dbo].[Mieszkancy]
where miejscowosc = 'Białystok'
 

niedziela, 12 sierpnia 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - transformacja Data Conversion

Dzisiaj publikuję kolejne nagranie z cyklu "SQL Server Integration Services (SSIS) w praktyce". Tym razem, przedstawiam zagadnienia dotyczące wykorzystania transformacji Data Conversion.



Link do tabelki z rozpiską typów danych, o którym wspominam w trakcie filmu.

sobota, 4 sierpnia 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - transformacja Character Map

Dzisiaj publikuję kolejne nagranie z cyklu "SQL Server Integration Services (SSIS) w praktyce". Tym razem, przedstawiam zagadnienia dotyczące wykorzystania transformacji Character Map.



niedziela, 29 lipca 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - transformacja Audit

Dzisiaj publikuję kolejne nagranie z cyklu "SQL Server Integration Services (SSIS) w praktyce". Tym razem, przedstawiam zagadnienia dotyczące wykorzystania transformacji Audit.


niedziela, 22 lipca 2018

[PL] Czy i jak ustawić opcję Lock Pages in memory dla SQL Server?

System Windows pozwala określić, które konta mają przechowywać dane tylko w pamięci fizycznej, bez możliwości przenoszenia danych do pliku stronicowania. Warto rozważyć stosowanie tej opcji w odniesieniu do konta serwisowego, na którym pracuje SQL Server.  Wspomniana polisa nazywa się Lock pages in memory i znajduje się w konsoli secpol.msc w gałęzi: Security Settings \ Local Policies \ User Rights Assignment.



niedziela, 20 maja 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - transformacja Sort

Dzisiaj publikuję kolejne nagranie z cyklu "SQL Server Integration Services (SSIS) w praktyce". Tym razem, przedstawiam zagadnienia dotyczące wykorzystania transformacji Sort.


sobota, 12 maja 2018

[PL] SQL Server 2012 SP4 - jak sprawdzić ile miejsca zajmuje baza danych albo wybrana tabela?

W SQL Server istnieje wbudowana, systemowa procedura składowana o nazwie sp_spaceused, która pozwala na wyświetlenie informacji na temat tego ile miejsca zajmuje wybrana baza danych albo pojedyncza tabela. 

Aby skorzystać ze wspomnianej procedury, w celu ustalenia rozmiaru bazy danych, wystarczy wywołać polecenie EXEC sp_spaceused. W odpowiedzi powinniśmy uzyskać pożądane informacje. 


Aby ustalić rozmiar tabeli, należy wywołać przykładowo polecenie EXEC sp_spaceused N'dbo.BankiPolskie', gdzie dbo.BankiPolskie oznacza nazwę schematu i nazwę tabeli, która znajduje się we wskazanym schemacie. Żeby uzyskać pewność co do tego, że wartości, które zobaczymy będą aktualne, do naszego polecenia warto dodać jeszcze parametr @updateusage = N'TRUE'; Całość zatem będzie wyglądać następująco:

EXEC sp_spaceused N'dbo.BankiPolskie',
@updateusage = N'TRUE'; 
GO

Oto przykładowy wynik:


Z zaprezentowanej powyżej grafiki, możemy wywnioskować, że:
  • analizujemy tabelę o nazwie BankiPolskie (kolumna name)
  • ilość wierszy w tabeli BankiPolskie to 3 (kolumna rows)
  • całkowita ilość przydzielonego miejsca dla danego obiektu (w tym przypadku tabeli) to 16 KB (kolumna reserved)
  • całkowita ilość miejsca wykorzystywanego przez dane to 8 KB (kolumna data)
  • całkowita ilość miejsca wykorzystywanego przez indeksy to 8 KB (kolumna index_size)
  • całkowita ilość miejsca zarezerwowanego dla danego obiektu w bazie danych (w naszym przypadku tabeli), które nie jest wykorzystywane to 0 KB (kolumna unused)

sobota, 5 maja 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - precedence constraints

Dzisiaj publikuję kolejne nagranie z cyklu "SQL Server Integration Services (SSIS) w praktyce". Tym razem, przedstawiam podstawowe zagadnienia dotyczące wykorzystania precedence constraints.


piątek, 27 kwietnia 2018

[PL] SQL Server Integration Services (SSIS) w praktyce - Foreach Loop Container

Tym wpisem chciałbym rozpocząć cykl materiałów video poświęconych SQL Server Integration Services (SSIS) pod nazwą "SQL Server Integration Services (SSIS) w praktyce". W pierwszym nagraniu pokrótce omawiam do czego służy Foreach Loop Container w SSIS?

Otóż wyobraźmy sobie sytuację, w której główny oddział firmy istnieje w Warszawie, z kolei dodatkowe oddziały firmy są zlokalizowane w stolicy każdego województwa. Każdy oddział firmy pracuje na własnej, niezależnej bazie danych i na potrzeby analityki, chcielibyśmy analizować dane całości firmy. Możemy zatem wyeksportować dane z każdego oddziału firmy do pliku CSV celem zaimportowania ich do jednego, centralnego systemu w postaci hurtowni danych. Wówczas uzbiera nam się w sumie kilkanaście plików, po jednym z każdego województwa. Żeby nie tworzyć odrębnych zadań importu danych z każdego pliku typu C:\pliki\Wroclaw.csv, C:\pliki\Olsztyn.csv, C:\pliki\Warszawa.csv itd., możemy utworzyć jedno zadanie, które zaimportuje zbiorczo wiele plików do naszej hurtowni danych. Jak to zrobić używając Foreach Loop Container w Microsoft SQL Server Integration Services?


niedziela, 22 kwietnia 2018

[PL] SQL Server 2012 SP4 - jak wykryć kto dokonał zmiany struktury tabeli?

W SQL Server znajdują się wbudowane raporty dotyczące pracy serwera i środowiska, w którym on pracuje. Są one dostępne pod menu Reports, które jest widoczne po kliknięciu prawym przyciskiem myszy  na instancję albo konkretną bazę danych.





Jednym z dostępnych raportów jest na przykład Schema changes history, który pozwala na wyświetlić informacje na temat zmian schematu danej bazy danych. Dzięki temu jesteśmy w stanie dowiedzieć się np. kto dokonał utworzenia danej tabeli bądź jej zmiany z dokładnością do rodzaju operacji (np. CREATE, ALTER), daty kiedy operacja została wykonana i nazwy użytkownika, który dokonał konkretnej zmiany. 

poniedziałek, 12 marca 2018

[PL] O właściwości IDENTITY w SQL Server 2014 SP2

Jeżeli podczas tworzenia tabeli w bazie danych określimy dla niej właściwość identity, to podczas wprowadzania danych do tabeli, wartość dla wiersza w tej kolumnie przyjmie narastającą wartość. Wartości w kolumnie z włączoną właściwością identity narastają co określoną wartość (określoną jako druga w nawiasie), zaczynając od wartości podanej jako pierwsza w nawiasie. Na przykład w poniższym przykładzie kolumna id będzie przyjmować wartości od 115 wzrastając o 20, czyli pierwszy wiersz otrzyma wartość 115, drugi 135, trzeci 155 itd.

USE tempdb;
go

CREATE TABLE [dbo].[test27072017] (

id int not null identity (115,20),
kolumna2 NVARCHAR(15),
kolumna3 NVARCHAR(15)
)

Dodajmy zatem kilka wierszy do utworzonej przed chwilą tabeli i sprawdźmy wynik

INSERT INTO [dbo].[test27072017] (kolumna2, kolumna3) VALUES (N'test1', N'test2');
INSERT INTO [dbo].[test27072017] (kolumna2, kolumna3) VALUES (N'test3', N'test4');
SELECT * FROM [dbo].[test27072017]

Jak widzimy pierwszy wiersz otrzymał wartość 115, kolejny 135.


Jeżeli chcielibyśmy przypisać wartość dla kolumny id z właściwością identity samodzielnie, otrzymamy błąd.

INSERT INTO [dbo].[test27072017] (id, kolumna2, kolumna3) VALUES (12, N'test3', N'test4');


Jeżeli chcielibyśmy umożliwić taką operację, należy włączyć opcję IDENTITY_INSERT w odniesieniu do bazy danych.

SET IDENTITY_INSERT [dbo].[test27072017] ON;

I wówczas system pozwoli na wprowadzenie do tabeli własnej wartości dla kolumny z właściwością identity.



Aby z powrotem wyłączyć taką możliwość, należy skorzystać z polecenia:

SET IDENTITY_INSERT [dbo].[test27072017] OFF;

Aby określić wartość generatora dla pola IDENTITY w konkretnej tabeli możemy skorzystać z następującego polecenia:
DBCC CHECKIDENT('dbo.tabela', RESEED, 400);
W powyższym przykładzie dla tabeli o nazwie 'tabela' znajdującej się w schemacie 'dbo' zostanie ustawiona wartość generatora 400 dla pola typu identity.

Aby sprawdzić aktualną wartość pola typy identity w konkretnej tabeli należy użyć polecenia: 
SELECT IDENT_CURRENT('dbo.tabela') AS [IDENT_CURRENT];

poniedziałek, 5 marca 2018

[PL] SQL Server 2012 SP4 - reguły (ograniczenia) zawartości kolumn

W momencie gdy pojawia się potrzeba kontrolowania wartości jakie mogą pojawić się w konkretnej kolumnie w bazie danych istnieje możliwość utworzenia tzw. ograniczenia (constraint). Przykładowo, możemy mieć tabelę przeznaczoną na dane osób (np. klientów) i chcieć, aby w kolumnie „płeć” dało się wprowadzić jedynie wartości zgodne ze standardem PN-ISO 5218, gdzie: 0 oznacza płeć nieokreśloną, 1 – mężczyznę, 2 – kobietę, 9 – wartość nieznaną. Aby to zrobić, podczas tworzenia tabeli możemy zastosować polecenie CONSTRAINT zgodnie z przykładem poniżej.

USE BazaTestowa
GO

CREATE TABLE dbo.Osoby (
Id BIGINT IDENTITY(1,1)
               NOT NULL
               PRIMARY KEY,
Imie nvarchar(200) NOT NULL,
Nazwisko nvarchar(200) NOT NULL,
DataUrodzenia date NOT NULL,
Plec char(1) NOT NULL
CONSTRAINT CHK_Osoby_Plec_wartosc_zgodna_z_PN_ISO_5218
CHECK (Plec in ('0', '1', '2', '9')),
);

Jeżeli zechcemy teraz wprowadzić do bazy danych wiersz zawierający zawartość kolumny Plec w postaci cyfry 0, 1, 2 lub 9 to operacja powinna się udać.

INSERT INTO dbo.Osoby (Imie, Nazwisko, DataUrodzenia, Plec)
VALUES (N'Jan',N'Kowalski', '1990-01-01', '1');

Jednak w przypadku próby wprowadzenia do bazy danych np. wartości 3 w kolumnie Plec (czy innej niż 0,1,2 lub 9), wspomniana czynność nie uda się – zostanie wyświetlony błąd odwołujący się do stworzonego wcześniej ograniczenia. 

INSERT INTO dbo.Osoby (Imie, Nazwisko, DataUrodzenia, Plec)
VALUES (N'Anna',N'Kowalska', '1980-01-01', '3');


poniedziałek, 26 lutego 2018

[PL] SQL Server 2012 SP4 - jak wykryć fakt zmiany danych w tabeli i zapisać informacje na ten temat w bazie danych?

Dzisiaj, korzystając z SQL Servera, spróbujemy zarejestrować w bazie danych informacje o tym, że dane w wybranej kolumnie w określonej tabeli zostały zmodyfikowane. 
Zacznijmy od utworzenia tabeli testowej korzystając z poniższego kodu:

USE BazaTestowa
GO

CREATE TABLE dbo.Osoby (
Id BIGINT IDENTITY(1,1)
               NOT NULL
               PRIMARY KEY,
Imie nvarchar(200) NOT NULL,
Nazwisko nvarchar(200) NOT NULL,
DataUrodzenia date NOT NULL,
Plec char(1) NOT NULL,
Miasto varchar(100) NOT NULL,
Kraj varchar(20) NOT NULL,
Przeprowadzka bit,
PrzeprowadzkaData date
);

Jak widzimy powyżej, nasza testowa tabela:
  • została utworzona w schemacie dbo
  • nosi nazwę Osoby
  • została stworzona w celu ewidencjonowania danych o osobach, w tym: imienia (kolumna Imie), nazwiska (kolumna Nazwisko), daty urodzenia (kolumna DataUrodzenia), płci (kolumna Plec), miasta (kolumna Miasto), kraju (kolumna Kraj)
  • w kolumnie Plec pozwala na zapisywanie danych na temat płci zgodnie ze standardem PN-ISO 5218:
    • 0 – płeć nieokreślona
    • 1 – mężczyzna
    • 2 - kobieta
    • 9 – nieznana
  • zawiera kolumny Przeprowadza i PrzeprowadzkaData w których zapisywać będziemy informacje o fakcie zmiany adresu przez osobę
  • zawiera kolumnę ID, która jest kluczem podstawowym i wartości - na potrzeby tej kolumny - są generowanie automatycznie dla każdego wiersza, zaczynając od 1 i wzrastając co 1
Załadujmy dane do naszej testowej tabeli:

INSERT INTO dbo.Osoby (Imie, Nazwisko, DataUrodzenia, Plec, Miasto, Kraj)
VALUES (N'Jan',N'Kowalski', '1990-01-01', '1', 'Warszawa', 'Polska');
INSERT INTO dbo.Osoby (Imie, Nazwisko, DataUrodzenia, Plec, Miasto, Kraj)
VALUES (N'Anna',N'Kowalska', '1980-01-01', '1', 'Szczecin', 'Polska');
INSERT INTO dbo.Osoby (Imie, Nazwisko, DataUrodzenia, Plec, Miasto, Kraj)
VALUES (N'Tadeusz',N'Wiśniewski', '1984-01-01', '1', 'Kraków', 'Polska');

Sprawdźmy, że tabela dbo.Osoby zawiera dodane przed chwilą dane – powinny znajdować się w niej trzy rekordy. Zwróćmy uwagę na kolumny Przeprowadzka i PrzeprowadzkaData – nie mają one żadnej wartości.

SELECT * FROM dbo.Osoby;


Kolejnym krokiem jest utworzenie triggera, czyli wyzwalacza, który:
  • będzie włączał się po każdej operacji aktualizacji danych w tabeli dbo.Osoby
  • będzie sprawdzać czy zmianie uległy dane w kolumnie Miasto lub Kraj
  • jeżeli dane w kolumnie Miasto lub Kraj zostają zmienione, to kolumna Przeprowadzka zostanie uzupełniona wartością 1, a PrzeprowadzkaData – bieżącą datą

CREATE TRIGGER dbo.OsobyAfterUpdate01
ON dbo.Osoby
AFTER UPDATE
AS
IF ( UPDATE (MIASTO) OR UPDATE (KRAJ) ) 
BEGIN
SET NOCOUNT ON;
UPDATE dbo.Osoby SET
Przeprowadzka = 1,
PrzeprowadzkaData = GETDATE()
from deleted d, dbo.Osoby o
where d.Id = o.Id
END
GO

Czas na końcowe testy – sprawdźmy działanie triggera. Aby to zrobić, zaktualizujmy dane w kolumnie Miasto dla wiersza z identyfikatorem 2, a następnie wyświetlmy aktualną zawartość tabeli dbo.Osoby.

UPDATE dbo.Osoby
SET Miasto = 'Gdańsk'
WHERE Id = 2;

SELECT * FROM dbo.Osoby;

Wynik powinien być następujący:


Czyli pożądana zmiana została wprowadzona (wartość kolumny Miasto została zmieniona), a ponadto trigger zadziałał prawidłowo – dla rekordu o identyfikatorze 2 została zaktualizowana zawartość kolumny Przeprowadzka i PrzeprowadzkaData.

Żeby mieć pewność, że wszystko działa prawidłowo, zróbmy jeszcze jeden test, który upewni nas, że trigger nie zadziała w przypadku aktualizacji danych w innej kolumnie niż Miasto lub Kraj, np. Plec. Zaktualizujmy zatem dla rekordu o identyfikatorze 3 wartość kolumny Plec z 1 (mężczyzna) na 9 (nieznana) i sprawdźmy aktualną zawartość tabeli dbo.Osoby.

UPDATE dbo.Osoby
SET Plec = '9'
WHERE Id = 3;

SELECT * FROM dbo.Osoby;


W tym przypadku również widzimy, że wszystko zadziałało prawidłowo, ponieważ dla rekordu o identyfikatorze 3 kolumny Przeprowadzka i PrzeprowadzkaData pozostały bez wartości, czyli trigger nie zaktualizował niepotrzebnie kolumn Przeprowadzka i PrzeprowadzkaData - stało się tak za sprawą warunku IF ( UPDATE (MIASTO) OR UPDATE (KRAJ) )  zawartego w triggerze, gdyż funkcja UPDATE służy do wykrywania zmian na określonej kolumnie.