LinkedServer czyli podłączamy się do drugiego serwera

Utworzymy sobie linked server

USE [master]
GO
EXEC master.dbo.sp_addlinkedserver
@server = N'MICEK1968\MSSQLSERVER1',
@srvproduct=N'SQL Server' ;
GO

Commands completed successfully.

SELECT FirstName, LastName, BirthDate
FROM [MICEK1968\MSSQLSERVER1].[Northwind1].[dbo].[Employees]
GO

Taki linked server będzie działał jeśli posiadamy na drugim serwerze uprawnienia.

Możemy do tego też wykorzystać specjalnie utworzone na serwerze SQL konta dla linked server. Za ich pomocą możemy kontrolować co użytkownik będzie widział za pomocą udostępnionego linked serwera.

usuwamy utworzonego linked serwera

USE [master]
GO
EXEC master.dbo.sp_dropserver @server=N'MICEK1968\MSSQLSERVER1', @droplogins='droplogins'
GO

Commands completed successfully.

Najpierw zakładamy użytkownika bazodanowego na naszym drugim serwerze (z którego będziemy zbierać dane).

Na razie nie dajemy mu żadnych uprawnień.

Na pierwszym serwerze dodajemy Linked Server

Wpisujemy dane naszego serwera z danymi

wpisujemy naszego utworzonegop usera

Sprawdzamy co widzi nasz Linked Server 🙂

Niewiele widzi więc pora mu udostępnić naszą bazę (w tym przykładzie to TSQL2012). Nadajemy uprawnienia dla usera LINK_USER. Zaznaczamy naszą bazę ale nie przyznajemy żadnych uprawnień na niej gdzyż będziemy chcieli udostępnić tylko jedna tabelę z tej bazy dla naszego Linked Servera

Linked Server widzi już naszą bazę ale bez tabel

Na drugim serwerze wchodzimy do bazy TSQL2012 i wybieramy naszą tabelę.

We właściwościach nadajemy uprawnienia SELECT dla LINK_USER

Sprawdzamy czy po odświeżeniu w Linked Server pojawi się nasza tabela

Teraz sprawdzimy czy Linked Server działa.

SELECT FirstName, LastName, BirthDate
FROM [MICEK1968\MSSQLSERVER1].[TSQL2012].[HR].[Employees]
GO

Zaszufladkowano do kategorii Microsoft SQL | Dodaj komentarz

Synonimy w SQL Server

Synonimy to nic innego jak odnośniki (skrócone nazwy) do naszych obiektów w bazie. Ułatwiają one nam pracę np. przy częstym wykorzystywaniu tych samych długich nazw baz, schematów i tabel.

SELECT TOP (10) [BusinessEntityID]
,[FirstName]
,[LastName]
,[ModifiedDate]
FROM [AdventureWorks2012].[Person].[Person]

Zamiast wpisywać za każdym razem [AdventureWorks2012].[Person].[Person] utworzymy synonim [OSOBY_2012], które będą się odwoływać do naszej tabeli

Możemy to zrobić poleceniem:

USE [AdventureWorks2012]
GO
CREATE SYNONYM [dbo].[OSOBY_2012] FOR [MICEK1968].[AdventureWorks2012].[Person].[Person]
GO

Commands completed successfully.

Lub w Managemenct Studio

a następnie wypełniamy odpowiednio:

Pozostałe zakładki zostawiamy bez modyfikacji.

Po utworzeniu synonimu sprawdzamy czy działa 🙂

SELECT TOP (10) [BusinessEntityID]
,[FirstName]
,[LastName]
,[ModifiedDate]
FROM OSOBY_2012;

Działa więc możemy go usunąć

USE [AdventureWorks2012]
GO
DROP SYNONYM [dbo].[OSOBY_2012]
GO

Commands completed successfully.
Zaszufladkowano do kategorii Microsoft SQL | Dodaj komentarz

Triggery DML w SQL Server

DML triggery (Data Manipulation Language – czyli INSERT/UPDATE/DELETE) są to obiekty bazodanowe w MS SQL Server, których implementacja jest wykonywana po lub przed wystąpieniem któregoś z poniższych trzech poleceń (lub ich kombinacji):
INSERT – wstawianie danych
DELETE – usunięcie danych
UPDATE – aktualizacja danych

Niezależnie od ilości modyfikowanych wierszy przez poszczególne polecenia, trigger do obsługi danego zdarzenia będzie wywołany tylko raz.Jeżeli żaden wiersz w tabeli nie będzie zmodyfikowany trigger obsługujący dane zdarzenie też zostanie wywołany.

Triggery można tworzyć (CREATE TRIGGER), usuwać (DROP TRIGGER), deaktywowac (ENABLE TRIGGER), aktywować (DISABLE TRIGGER).

Triggery DML w MS SQL Server mogą być powiązane zarówno z tabelą jak i widokiem.W kontekście triggerów DML, czyli powiązanych z modifikacją danych możemy wyróżnić dwa typy triggerów:
INSTEAD OF i AFTER

Typ Triggera Obsługa tabeli Obsługa widoku
AFTER Tak Nie
INSTEAD OF Tak Tak

Informacje o statusie DML triggera, jego typie i powiązaniach można odczytać z dwóch tabel systemowych sys.triggers i sys.trigger_events.

SELECT t.*, te.*
FROM sys.triggers t
INNER JOIN sys.trigger_events te
ON t.object_id = te.object_id

Tabele Inserted i Deleted nie mogą być modyfikowane, mogą być wykorzystywane tylko do odczytu.

Inserted – zawiera dane wstawione do tabeli/widoku poleceniem INSERT, lub nową wesję danych zmodyfikowanych poleceniem UPDATE.

Tabela Deleted – zawiera dane usunięte z tabeli/widoku poleceniem DELETE, lub oryginalne wartości danych przed zmianami wprowadzonymi poleceniem UPDATE.

Tabel Updated – NIE ISTNIEJE

Na początek stworzymy jakiegoś małego i prostego triggera typu AFTER

use master;
GO
CREATE DATABASE TriggerDatabase;
GO

Commands completed successfully.

use TriggerDatabase;
GO
CREATE TABLE dbo.Customers
(
CustomerName Varchar(10) NOT NULL
)
GO

Commands completed successfully.

CREATE TRIGGER dbo.Customers_AfterDelete
ON dbo.Customers
AFTER DELETE
AS
BEGIN
PRINT 'After Delete'
END
GO

Commands completed successfully.

DELETE FROM Customers
WHERE 1=0
GO
DROP TRIGGER dbo.Customers_AfterDelete
GO

After Delete

(0 rows affected)

To był trigger typu AFTER. Teraz przykład trigera typu INSTEAD OF.

CREATE VIEW dbo.vCustomers
AS
SELECT CustomerName FROM dbo.Customers
GO

Commands completed successfully.

CREATE TRIGGER dbo.vCustomers_AfterDelete
ON dbo.vCustomers
INSTEAD OF DELETE
AS
BEGIN
DELETE c
FROM dbo.Customers c
INNER JOIN deleted d
ON c.CustomerName = d.CustomerName
END
GO

Commands completed successfully.

INSERT INTO dbo.Customers(CustomerName)
VALUES('Jef')
GO

(1 row affected)

select * from dbo.Customers

CustomerName
------------
Jef

(1 row affected)

DELETE vCustomers WHERE CustomerName = 'Jef'
GO

(1 row affected)

(1 row affected)

DROP TRIGGER dbo.vCustomers_AfterDelete
GO

Commands completed successfully.
Zaszufladkowano do kategorii Microsoft SQL | Dodaj komentarz

Funkcje w SQL Server

SELECT [BusinessEntityID]
,[NationalIDNumber]
,[LoginID]
,[JobTitle]
,[BirthDate]
,[HireDate]
FROM [AdventureWorks2012].[HumanResources].[Employee]

Tworzymy funkcję wyszukującą tylko rekordy z podanym zawodem (JobTitle):

CREATE FUNCTION Sales.ufn_MojaFunkcja (@Job_Title varchar(20))
RETURNS TABLE
AS
RETURN
(
SELECT [BusinessEntityID]
,[NationalIDNumber]
,[LoginID]
,[JobTitle]
,[BirthDate]
,[HireDate]
FROM [AdventureWorks2012].[HumanResources].[Employee]
WHERE [JobTitle] = @Job_Title
);
GO

Commands completed successfully.

Wywołujemy funckję:

SELECT * FROM Sales.ufn_MojaFunkcja ('Marketing Specialist');

Zaszufladkowano do kategorii Microsoft SQL | Dodaj komentarz

Sekwencje w SQL Server

Od wersji SQL Server 2012 udostępniono mechanizm sekwencji. Sekwencja jest mechanizmem podobnym do mechanizmu Identity (AutoIncrement wierszy przy tworzeniu tabel). Sekwencje jednak nie są związane z tabelą i możemy z nich korzystać w dowolnym momencie pobierając kolejną wartość.

Aby utworzyć sekwencję należy wydać polecenie:

CREATE SEQUENCE dbo.MojaSekwencja
AS INT
MINVALUE 1
NO MAXVALUE
START WITH 1;

Commands completed successfully.

Założona sekwencja ma minimalną wartość 1 i będzie się powiększała o 1 do nieskończoności.
Sekwencję możemy również założyć korzystając z Management Studio.

Ja już jest stworzona aby pobrać wartość wykonujemy:

use [baza_testowa]
SELECT NextOrderID = NEXT VALUE FOR dbo.MojaSekwencja;

NextOrderID
-----------
1

(1 row affected)

Każde kolejne uruchomienie powoduje zwrócenie kolejnej wartości zgodnie z zdefiniowaną sekwencją.

Teraz utworzymy tabelę i spróbujemy za pomocą sekwencji wstawić kilka wierszy:

create table testowa_SEQ (id int not null primary key,opis varchar(255));

Commands completed successfully.

insert into testowa_SEQ (id,opis) values (NEXT VALUE FOR [MojaSekwencja],'jakis opis');
go 10

Beginning execution loop

(1 row affected)
...
(1 row affected)
Batch execution completed 10 times.

SELECT [id],[opis] FROM [baza_testowa].[dbo].[testowa_SEQ]

id          opis
----------- --------------------------
1           jakis opis
2           jakis opis
3           jakis opis
4           jakis opis
5           jakis opis
6           jakis opis
7           jakis opis
8           jakis opis
9           jakis opis
10          jakis opis

(10 rows affected)

Wartość sekwencji możemy „wyzerować” do dowolnej wartości

use [baza_testowa]
SELECT NextOrderID = NEXT VALUE FOR dbo.MojaSekwencja

NextOrderID
--------------------
3

(1 row affected)

Jeśli będziemy chcieli ustawić wartość powyżej zadeklarowanej maksymalnej wartości sekwencji otrzymamy komunikat

ALTER SEQUENCE [MojaSekwencja]
RESTART WITH 198;

Msg 11703, Level 16, State 1, Line 8
The start value for sequence object 'MojaSekwencja' must be between the minimum and maximum value of the sequence object.

Przy ustawieniu nowej wartości powyżej „obecnej” otrzymamy

ALTER SEQUENCE [MojaSekwencja]
RESTART WITH 98;

The sequence object 'MojaSekwencja' cache size is greater than the number of available values.

Ustawione mamy maksymalną wartość na 100 więc po kilku uruchomieniach Selecta otrzymamy

SELECT NextOrderID = NEXT VALUE FOR [MojaSekwencja];

Msg 11728, Level 16, State 1, Line 19
The sequence object 'MojaSekwencja' has reached its minimum or maximum value. Restart the sequence object to allow new values to be generated.

Możemy wtedy zresetować wartość lub ustawić zapętlenie (opcja CYCLE) lub

CREATE SEQUENCE dbo.MojaSekwencja
AS INT
MINVALUE 1
MAXVALUE 100
cycle
START WITH 1;

Commands completed successfully.

Niestety po wykonaniu insertów do tabeli a następnie usunięciu wierszy (podobnie jak w Identity) powstaną „dziury”. Nie ma możliwości sprawdzenia brakujących wartości. Możemy jedynie sprawdzić aktualną wartość sekwencji wykonując:

SELECT current_value
FROM sys.sequences
WHERE name = 'MojaSekwencja';

current_value
-------------------------
43

(1 row affected)

więcej o sekwencjach znajdziemy na
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-sequence-transact-sql?view=sql-server-2017

Zaszufladkowano do kategorii Microsoft SQL | Dodaj komentarz

SQL Raport Builder – krok drugi

Jak już umiemy wykonywać proste tabeli i wykresy możemy pobawić się w łączenie tych elementów oraz nauczyć się wykorzystywać zaawansowane funkcje Raport Buildera. Np spróbujemy zrobimy tabelkę pokazującą graficznie zajętość logów transakcyjnych bazy.

Po uruchomieniu Report Buildera tworzymy DataSource (do serwera localhost i bazy master) oraz DataSet gdzie w oknie query wpisujemy polecenie zwracające zajętość plików logów transakcyjnych czyli DBCC SQLPERF(logspace).

Polecenie zwraca cztery kolumny w tym jedną „status” której nie będziemy wykorzystywali.

Usuwamy ją a w jej miejsce dodajemy nowe pole (Field) wybierając z menu „Add Calculated Field”.


Polem tym będzie wyliczona procentowa wartość wolnej przestrzeni, gdyż polecenie zwraca tylko procentową ilość użytego miejsca w pliku. Wpisujemy nazwę naszego nowego pola oraz treść wyrażenia obliczającego nasze pole.



Następnie wstawiamy tabelkę i wklejamy do niej nasze dane. Sprawdzamy jak to wygląda.

Trochę nieciekawie pokazuje nasze dane. Trzeba usunąć miejsca po przecinku.
Zmieniamy to we właściwościach pola tekstowego w tabelce.


Sprawdzamy jak to wygląda po zmianie.

Jest lepiej. Pora wkleić trochę kolorów do naszej tabelki. najpierw dodajemy jeszcze jedną kolumnę w naszej tabeli w której dodamy kolorowe wykresiki 🙂

Następnie dodajemy poziomy wykres „DATA BAR”

Wybieramy typ wykresu.


Zostanie on wklejony poniżej tabelki więc musimy go przeciągnąć do niej. następnie przeciągamy nasze pola do okien parametrów naszego DATA BAR’a

Wchodzimy do właściwości wykresu

i ustawiamy maksymalną wartość wykresu.


I mamy piękne kolorowe wykresiki. Możemy im we właściwościach pozmieniać kolory, obramowania i inne wizualne ustawienia.

Zaszufladkowano do kategorii Microsoft SQL | Dodaj komentarz

Przenoszenie tabel pomiędzy bazami

Czasami zdarza się że „uszkodziliśmy” jedną z tabel w bazie (np. usunęliśmy lub nadpisaliśmy ją jakimiś błędnymi danymi). Jedyny sposób na przywrócenie to odzyskanie całej bazy, a my tego nie chcemy bo potrzebujemy tylko tej jednej tabeli. Rozwiązaniem tego problemu jest odtworzenie naszej całej bazę pod inną nazwą a następnie przekopiowanie odzyskanych danych z tabeli do naszej „uszkodzonej”.

Najlepiej przed przenoszeniem danych należy usunąć z niej wszystkie dane (zastąpimy je nowymi odzyskanymi z backupu)
zapytanie

select count(*) from dbo.YourTableNameHere

powinno zwracać wartość zero

Jeśli ją usunęliśmy to tabelę przed przenoszeniem danych musimy utworzyć (SQL sam za nas tego nie zrobi).

Po odtworzeniu bazy musimy wydać polecenie :

SELECT *
INTO [destination server].[destination database].[dbo].[destination table]
FROM [source server].[source database].[dbo].[source table]

lub inny sposób

INSERT INTO dbo.YourTableNameHere
SELECT *
FROM [SourceServer].[SourceDatabase].dbo.YourTableNameHere

następnie możemy sprawdzić czy dane się przeniosły

select count(*) from dbo.YourTableNameHere

Jednak takie „przenoszenie” danych jest głównie używane przy prostych tabelach. Ja wolę skorzystać z graficznego narzędzia dostarczonego przez Management Studio. Warunkiem bezbłędnego przeniesienia danych jest to aby w tabeli docelowej kolumny były tego samego typu co w docelowej. Nie można przenosić np kolumny z danymi INT do kulumny z danymi VARCHAR.
Załóżmy że chcemy przenieść kilka kolumn z tabeli

SELECT TOP (5) [EmployeeID]
,[LastName]
,[FirstName]
,[Title]
,[TitleOfCourtesy]
,[BirthDate]
,[HireDate]
-- ,[Address]
,[City]
,[Region]
,[PostalCode]
,[Country]
,[HomePhone]
,[Extension]
-- ,[Photo]
-- ,[Notes]
-- ,[ReportsTo]
-- ,[PhotoPath]
FROM [Northwind].[dbo].[Employees]

EmployeeID  LastName             FirstName  Title                          TitleOfCourtesy           BirthDate               HireDate                City            Region          PostalCode Country         HomePhone                Extension
----------- -------------------- ---------- ------------------------------ ------------------------- ----------------------- ----------------------- --------------- --------------- ---------- --------------- ------------------------ ---------
1           Davolio              Nancy      Sales Representative           Ms.                       1948-12-08 00:00:00.000 1992-05-01 00:00:00.000 Seattle         WA              98122      USA             (206) 555-9857           5467
2           Fuller               Andrew     Vice President, Sales          Dr.                       1952-02-19 00:00:00.000 1992-08-14 00:00:00.000 Tacoma          WA              98401      USA             (206) 555-9482           3457
3           Leverling            Janet      Sales Representative           Ms.                       1963-08-30 00:00:00.000 1992-04-01 00:00:00.000 Kirkland        WA              98033      USA             (206) 555-3412           3355
4           Peacock              Margaret   Sales Representative           Mrs.                      1937-09-19 00:00:00.000 1993-05-03 00:00:00.000 Redmond         WA              98052      USA             (206) 555-8122           5176
5           Buchanan             Steven     Sales Manager                  Mr.                       1955-03-04 00:00:00.000 1993-10-17 00:00:00.000 London          NULL            SW1 8JR    UK              (71) 555-4848            3453

(5 rows affected)

W nowej docelowej tabeli będzie tylko kilka kolumn z tabeli źródłowej.
Tworzymy tabelę w bazie testowej.

USE [baza_testowa]
CREATE TABLE [dbo].[Employees_NEW]
(
[EmployeeID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[LastName] [nvarchar](20) NOT NULL,
[FirstName] [nvarchar](10) NOT NULL,
[Title] [nvarchar](30) NULL,
[BirthDate] [datetime] NULL,
[City] [nvarchar](15) NULL
)

Commands completed successfully.

Sprawdzamy

USE [baza_testowa]
SELECT * FROM [dbo].[Employees_NEW]

EmployeeID  LastName             FirstName  Title                          BirthDate               City
----------- -------------------- ---------- ------------------------------ ----------------------- ---------------

(0 rows affected)

uruchamiamy eksport danych.


Wybieramy bazę źródłową

i bazę docelową

Ustawiamy czy chcemy ręcznie utworzyć skrypt do przenoszenia danych czy uruchomić kopiowanie automatycznie

Ustawiamy z jakiej tabeli do jakiej mają być kopiowane dane. Możemy wybrać istniejącą tabelę ale również możemy zostawic taką jak jest wpisana (nazwa taka sama jak źródłowa) i wtedy zostanie on utworzona.

Następnie wciskamy przycisk MAPPING gdzie ustalimy jakie kolumny mają być kopiowane. Możemy tu też ustawić czy dane mają być najpierw usunięte z docelowej tabeli (DELETE ROWS…) czy mają być dopisane (APPEND ROWS…)

Potwierdzamy że ma kopiowanie ma być uruchomione natychmiast po zakończeniu konfiguracji. Można to też zapisać jako paczkę DTS (SSIS).

Uruchamiamy

No i skończyło się błędem.

Sprawdzamy przyczynę w logu.

Przyczyna leży w tym że pierwsza kolumna EmployeeID jest ustawiona jako IDENTITY czyli że w każdy wiersz będzie automatycznie wpisywany kolejny „numer wpisu”. W związku z tym nie możemy ręcznie tego zapełnić.

Wracamy do MAPPINGS i tam zaznaczamy aby kolumnę tą ignorował podczas exportu albo zaznaczamy opcję ENABLE IDENTITY INSERT.

Puszczamy jeszcze raz export.

Teraz poszło wszystko prawidłowo. Sprawdzamy dane w tabeli

USE [baza_testowa]
SELECT * FROM [dbo].[Employees_NEW]

EmployeeID  LastName             FirstName  Title                          BirthDate               City
----------- -------------------- ---------- ------------------------------ ----------------------- ---------------
1           Davolio              Nancy      Sales Representative           1948-12-08 00:00:00.000 Seattle
2           Fuller               Andrew     Vice President, Sales          1952-02-19 00:00:00.000 Tacoma
3           Leverling            Janet      Sales Representative           1963-08-30 00:00:00.000 Kirkland
4           Peacock              Margaret   Sales Representative           1937-09-19 00:00:00.000 Redmond
5           Buchanan             Steven     Sales Manager                  1955-03-04 00:00:00.000 London
6           Suyama               Michael    Sales Representative           1963-07-02 00:00:00.000 London
7           King                 Robert     Sales Representative           1960-05-29 00:00:00.000 London
8           Callahan             Laura      Inside Sales Coordinator       1958-01-09 00:00:00.000 Seattle
9           Dodsworth            Anne       Sales Representative           1966-01-27 00:00:00.000 London

(9 rows affected)

No i wszystko jest OK.

Zaszufladkowano do kategorii Microsoft SQL | Otagowano | Dodaj komentarz

WAITFOR

Czasami w naszych zapytaniach do bazy danych potrzebne jest wstrzymanie wykonywania na jakiś określony czas. Do tego służy właśnie polecenie WAITFOR.
Przykładowo jeśli chcemy aby do naszej tabeli dane były zapisywane „po jednej sztuce” przy czym po każdym wpisie miałaby nastąpić krótka przerwa:
Najpierw stworzymy sobie testową tabelkę.

USE [baza_testowa]
GO
CREATE TABLE [dbo].[waitfortable]
(
[nazwa] [nchar](10) NULL,
[liczba] [int] NULL
) ON [PRIMARY]
GO

Tworzymy polecenie zapisujące dane do tej tabeli które będzie trwało 60 sekund (60 insertów co 1 sekundę). Wykorzystamy do tego polecenie WAITFOR DELAY

SET NOCOUNT ON;
DECLARE @cnt2 INT = 1;
WHILE @cnt2 < 60
BEGIN
INSERT INTO [dbo].[waitfortable] ([nazwa],[liczba]) VALUES ('komputer',RAND()*1000)
SET @cnt2 = @cnt2 + 1;
WAITFOR DELAY '00:00:01'
END;
SET NOCOUNT OFF;

A teraz inne wykorzystanie polecenia WAITFOR. Opcja TIME spowoduje że nastąpi wstrzymanie dalszego wykonywania skryptu do godziny podanej w poleceniu.

WAITFOR TIME '20:45.000'
RAISERROR('Mineła 22:45... !', 0, 1) WITH NOWAIT

Zaszufladkowano do kategorii Microsoft SQL, TSQL | Dodaj komentarz

SQL Raport Builder – pierwsze kroki

W SQL Management Studio pewnie zdarzyło się nam korzystać z gotowych raportów przygotowanych przez Microsoft. Za ich pomocą można obejrzeć np zajętość plików danych i logów, użycie indeksów, dane dotyczące transakcji i wiele innych. Przykładowo:


Ale istnieje również możliwość zbudowania swojego raportu (nie koniecznie związanego z parametrami bazy danych). Może to być np. tabela z której bardzo często sprawdzamy. Zamiast codziennie wykonywać skrypt możemy przygotować sobie taki Raport.
Aby zbudować taki raport potrzebujemy narzędzia. Może to być bardziej skomplikowane Visual Studio albo prostsze narzędzie SQL Report Builder dostępny w darmowej wersji na stronach Microsoftu (zajmuje około 25MB):
wersja 2014 : https://www.microsoft.com/pl-pl/download/details.aspx?id=42301
wersja 2016 : https://www.microsoft.com/en-us/download/details.aspx?id=53613
Stworzone raporty możemy edytować w Visual Studio. Umożliwia ono edycję zaawansowaną (niektóre opcje niedostępne w Raport Builderach). Aby edytować raporty w Visual Studio potrzebne jest doinstalowanie narzędzia Microsoft SQL Server Data Tools (Business Intelligence for Visual Studio 2015) dostępne darmowo na stronie Microsoftu.
Elementy Raport Buildera (wykresy, tabele itd) też trochę się różnią. Według mnie wersja 2014 jest bardziej gadżeciarska, natomiast w 2016 postawili na prostotę.


Dodatkowo 2014 występuje w polskiej wersji językowej, natomiast 2016 jest po angielsku. Tak więc wybór należy do Was 🙂

Po ściągnięciu instalujemy narzędzie na swoim komputerze. Instalacja jest prosta i ogólnie polega na wciskaniu NEXT 🙂
Po zainstalowaniu uruchamiamy SQL Report Builder.

Na początku pojawi się nam ekran startowy ale na razie nie będziemy z niego korzystać (możemy go zamknąć).

Tak więc mamy okno w którym będziemy tworzyć nasz „raport”

Na początek coś łatwego. Zmienimy sobie nasz nagłówek, pokolorujemy go itd.

Na początek zrobimy raport wyświetlający dane w jednej z tabel naszej bazy.
Będzie on wykonywał nic innego niż zapytanie

SELECT TOP (10) [ProductName],[UnitPrice]
FROM [Northwind].[dbo].[Products]

ProductName                              UnitPrice
---------------------------------------- ---------------------
Chai                                     18,00
Chang                                    19,00
Aniseed Syrup                            10,00
Chef Anton's Cajun Seasoning             22,00
Chef Anton's Gumbo Mix                   21,35
Grandma's Boysenberry Spread             25,00
Uncle Bob's Organic Dried Pears          30,00
Northwoods Cranberry Sauce               40,00
Mishi Kobe Niku                          97,00
Ikura                                    31,00

(10 rows affected)

Na początek musimy skonfogurować połączenie do bazy.

Wybieramy opcję USE THE CONNECTION…i wciskamy przycisk BUILD

Podjeamy nazwę naszego serwera SQL oraz wybieramy z listy naszą bazę danych

Wykonujemy test połączenia

Potwierdzamy

Tu też możemy wykonać test 🙂

W zakładce CREDENTIALS wpisujemy konto za pomocą którego będziemy łączyli się do bazy. W naszym przypadku korzystamy z autentykacji windowsowej więc nic nie zmieniamy.

Po zatwierdzeniu w naszym drzewku pojawia się nowy DATA SOURCE1

Teraz pora wkleić tabelkę do naszego raportu.
W tym celu musimy dodać DATA SET czyli źródło naszych danych w raporcie.

W oknie poniżej wpisujemy zapytania zwracające nasze zapytanie, oraz wybieramy DATA SOURCE

W kolejnych zakładkach na razie nic nie zmieniamy.




Po dodaniu DATA SET pojawi się on nam w drzewku.

Teraz dodamy tabelę do naszego raportu


Do kolumny przesuwamy elementy (kolumny) z DATA SET
Jedna z kolumn nie będzie nam potrzebna więc ją usuwamy.


Teraz pora obejrzeć wynik naszej pracy. W tym celu wciskamy przycisk RUN

Kolumna pierwsza jest lekko za wąska i wiersze się nam zawijają.

Poprawiamy ją uruchamiając przycisk DESIGN


Rozszerzamy kolumnę i ponownie uruchamiamy raport przyciskiem RUN

Teraz jest wszystko OK.

Zapisujemy nasz raport na dysku.

teraz odpalamy nasz raport z Management Studio


No i mamy nasz raport.
Jakbyśmy chcieli umieścić np wykres oparty na naszej tabeli w raporcie postępujemy analogicznie jak w przypadku tabeli.



Klikając w wykres spowodujemy wyświetlenie okien do których przenosimy odpowiednie kolumny z DATA SET


Uruchamiamy raport przyciskiem RUN

Jest wiele do poprawienia ale ogólnie działa 🙂
Poprawimy może kolorki, damy jakieś fajne obramowanie wykresu i ustawimy dolne opisy, żeby opisy kolumn były pod kątem, a nie poziomo.

Ustawienia dotyczące wykresu:




Tak to wyglada w kreatorze. Uruchamiamy RUN

I mamy kolorowy wykres.

Zaszufladkowano do kategorii Microsoft SQL | Dodaj komentarz

Alerty SQL czyli jak zaspamować sobie pocztę

Ostatnio pokazywałem jak skonfogurować usługę SQLMail. Dziś pokażę przykładowy sposób jej wykorzystania. Skonfigurujemy sobie powiadomienia o rozroście loga transakcyjnego jednej z naszych baz.
Aby działały alerty musi działać SQLAgent. Rozwijamy drzewko Agenta i klikamy w Alerty i dalej w New Alert.

Otwiera nam się okienko w którym konfigurujemy jak ma się nazywać nasz alert, co ma monitorować i na jakiej bazie.


Na dole konfigurujemy np. wielkośc jaką ma przekroczyć nasz plik logu.
Przechodzimy do zakładki RESPONSE


W tej zakładce konfigurujemy do kogo ma zostać wysłany mail powiadamiający. W dolnym oknie wybieramy „operatorów” i zaznaczamy ze ma być wysłany mail.
Jeśli do tej pory nie utworzyliśmy sobie takie operatora możemy tu to zrobić za pomocą New Operator.

Po utworzeniu operatora ustawiamy dalsze parametry alertu (treść maila, częstotliwość jego wysyłania)

A tak to wygląda po skonfigurowaniu Alertu i Operatora.

Możemy we właściwościach Operatora sprawdzić jakie parametry bazy (alerty i joby) są dla niego skonfigurowane w powiadomieniach mailowych

Od tej pory po rozroście pliku loga poza zadeklarowany zakres powinniśmy otrzymać maila z alarmem.

Zaszufladkowano do kategorii Microsoft SQL | Dodaj komentarz