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, 29 grudnia 2018
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 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.
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
- 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];
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.
Subskrybuj:
Posty (Atom)