Transakcje inf. podstawowe! Rozpoczęcie transakcji " Explicit " Autocommit! Zakończenie transakcji " COMMIT " ROLLBACK " Implicit BEGIN TRANSACTION UPDATE savings... UPDATE checking... COMMIT TRANSACTION
Transakcje BEGIN TRANSACTION UPDATE savings SET amount = (amount - 100) WHERE custid = 78910 <Rollback transaction if if error> UPDATE checking SET amount = (amount + 100) WHERE custid = 78910 <Rollback transaction if if error> COMMIT TRANSACTION
Zmienne! DECLARE deklaruje zmienną! SET lub SELECT - nadaje wartość DECLARE @vlastname char(20), @vfirstname varchar(11) SET @vlastname = 'Dodsworth' SELECT @vfirstname = FirstName FROM Northwind..Employees WHERE LastName = @vlastname PRINT @vfirstname + ' ' + @vlastname GO
Instrukcje warunkowe, pętle " BEGIN END blocks " IF ELSE blocks " WHILE constructs " CASE expression IF IF USER_NAME() <> <> 'dbo' BEGIN RAISERROR('Must be be sysadmin to to Perform Operation', 10, 10, 1) 1) RETURN END END ELSE ELSE DBCC DBCC CHECKDB(Northwind)
Dynamiczne konstruowanie poleceń! EXECUTE + string zawierający polecenie DECLARE @dbname varchar(30), @tblname varchar(30) SET SET @dbname = 'Northwind' SET SET @tblname = 'Products' EXECUTE ('USE ' + @dbname + ' SELECT * FROM '+ '+ @tblname)
Procedury
Procedury (Stored Procedures)! Definiowanie procedur! Zalety
Stored Procedures - zalety! Umożliwiają definiowanie logiki aplikacji! Ułatwiają zarządzanie uprawnieniami! Poprawiają wydajność
Definiowanie procedur! Stored Procedure to skompilowna kolekcja poleceń Transact-SQL! Procedury: " mogą zawierać polecenia które manipulują danymi " mogą przyjmować dane w postaci parametrów " mogą zwracać wartość " mogą zwracać wartości w postaci parametrów
Tworzenie procedur! Polecenie CREATE PROCEDURE USE Northwind GO CREATE PROC dbo.overdueorders AS SELECT * FROM dbo.orders WHERE RequiredDate < GETDATE() AND ShippedDate IS Null GO! mogą być zagnieżdżone (do 32 poziomów)! sp_help pokazuje inf. o procedurze
Wykonanie procedury! Wykonanie EXEC OverdueOrders! Wykonanie w ramach polecenia INSERT INSERT INTO Customers EXEC EmployeeCustomer
Modyfikacja i usuwanie USE USE Northwind Northwind GO GO ALTER ALTER PROC PROC dbo.overdueorders AS AS SELECT SELECT CONVERT(char(8), CONVERT(char(8), RequiredDate, RequiredDate, 1) 1) RequiredDate, RequiredDate, CONVERT(char(8), CONVERT(char(8), OrderDate, OrderDate, 1) 1) OrderDate, OrderDate, OrderID, OrderID, CustomerID, CustomerID, EmployeeID EmployeeID FROM FROM Orders Orders WHERE WHERE RequiredDate RequiredDate < GETDATE() GETDATE() AND AND ShippedDate ShippedDate IS IS Null Null ORDER ORDER BY BY RequiredDate RequiredDate GO GO " usuwanie DROP PROC... " sp_depends pokazuje obiekty zależne
Procedury - parametry CREATE CREATE PROCEDURE PROCEDURE dbo.[year dbo.[year to to Year Year Sales] Sales] @BeginningDate @BeginningDate DateTime, DateTime, @EndingDate @EndingDate DateTime DateTime AS AS IF IF @BeginningDate @BeginningDate IS IS NULL NULL OR OR @EndingDate @EndingDate IS IS NULL NULL BEGIN BEGIN RAISERROR('NULL RAISERROR('NULL values values are are not not allowed', allowed', 14, 14, 1) 1) RETURN RETURN END END SELECT SELECT O.ShippedDate, O.ShippedDate, O.OrderID, O.OrderID, OS.Subtotal, OS.Subtotal, DATENAME(yy,ShippedDate) AS AS Year Year FROM FROM ORDERS ORDERS O INNER INNER JOIN JOIN [Order [Order Subtotals] Subtotals] OS OS ON ON O.OrderID O.OrderID = OS.OrderID OS.OrderID WHERE WHERE O.ShippedDate O.ShippedDate BETWEEN BETWEEN @BeginningDate @BeginningDate AND AND @EndingDate @EndingDate GO GO
Wywołanie procedury! Passing Values by Parameter Name EXEC EXEC AddCustomer @CustomerID = 'ALFKI', @ContactName = 'Maria Anders', @CompanyName = 'Alfreds Futterkiste', @ContactTitle = 'Sales Representative', @Address = 'Obere Str. Str. 57', 57', @City @City = 'Berlin', @PostalCode = '12209', @Country = 'Germany', @Phone = '030-0074321'! Passing Values by Position EXEC EXEC AddCustomer 'ALFKI2', 'Alfreds Futterkiste', 'Maria Anders', 'Sales Representative', 'Obere Str. Str. 57', 57', 'Berlin', NULL, NULL, '12209', 'Germany', '030-0074321'
Parametry wyjściowe Creating Stored Procedure Executing Stored Procedure Results of of Stored Procedure CREATE PROCEDURE dbo.mathtutor @m1 @m1 smallint, @m2 @m2 smallint, @result smallint OUTPUT AS AS SET SET @result = @m1* @m2 @m2 GO GO DECLARE @answer smallint EXECUTE MathTutor 5,6, @answer OUTPUT SELECT 'The result is: is: ', ', @answer The The result is: is: 30 30
Funkcje
Funkcje! Funkcje skalarne " Podobne do funkcji wbudowanych " Zwracają pojedynczą wartość! Multi-Statement Table-valued Functions " zawartość jak w przypadku stored procedures " odwołanie jak do widoku! In-line Table-valued Functions " podobne do widoków z parametrami
Funkcje! Tworzenie funkcji USE USE Northwind Northwind CREATE CREATE FUNCTION FUNCTION fn_newregion fn_newregion (@myinput (@myinput nvarchar(30)) nvarchar(30)) RETURNS RETURNS nvarchar(30) nvarchar(30) BEGIN BEGIN IF IF @myinput @myinput IS IS NULL NULL SET SET @myinput @myinput = 'Not 'Not Applicable' Applicable' RETURN RETURN @myinput @myinput END END
Funkcje! Modyfikacja funkcji ALTER ALTER FUNCTION FUNCTION dbo.fn_newregion dbo.fn_newregion <New <New function function content> content> " Uwaga: uprawnienia pozostają! Usunięcie funkcji DROP DROP FUNCTION FUNCTION dbo.fn_newregion dbo.fn_newregion
Scalar User-defined Function! Tworzenie USE USE Northwind Northwind CREATE CREATE FUNCTION FUNCTION fn_dateformat fn_dateformat (@indate (@indate datetime, datetime, @separator @separator char(1)) char(1)) RETURNS RETURNS Nchar(20) Nchar(20) AS AS BEGIN BEGIN RETURN RETURN CONVERT(Nvarchar(20), datepart(mm,@indate)) + @separator @separator + CONVERT(Nvarchar(20), datepart(dd, datepart(dd, @indate)) @indate)) + @separator @separator + CONVERT(Nvarchar(20), datepart(yy, datepart(yy, @indate)) @indate)) END END! Wywołanie SELECT SELECT dbo.fn_dateformat(getdate(), ':') ':')
Multi-Statement Table-valued Function! BEGIN and END nawiasy ograniczające! RETURNS określa definicję tabeli która ma być zwrócona
Multi-Statement Table-valued Function! Tworzenie USE USE Northwind Northwind GO GO CREATE CREATE FUNCTION FUNCTION fn_employees fn_employees (@length (@length nvarchar(9)) nvarchar(9)) RETURNS RETURNS @fn_employees @fn_employees table table (EmployeeID (EmployeeID int int PRIMARY PRIMARY KEY KEY NOT NOT NULL, NULL, [Employee [Employee Name] Name] nvarchar(61) nvarchar(61) NOT NOT NULL) NULL) AS AS BEGIN BEGIN IF IF @length @length = 'ShortName' 'ShortName' INSERT INSERT @fn_employees @fn_employees SELECT SELECT EmployeeID, EmployeeID, LastName LastName FROM FROM Employees Employees ELSE ELSE IF IF @length @length = 'LongName' 'LongName' INSERT INSERT @fn_employees @fn_employees SELECT SELECT EmployeeID, EmployeeID, (FirstName (FirstName + ' ' + LastName) LastName) FROM FROM Employees Employees RETURN RETURN END END! Wywołanie SELECT SELECT * FROM FROM dbo.fn_employees('longname') Or Or SELECT SELECT * FROM FROM dbo.fn_employees('shortname')
In-Line Table-valued Function! Treść funkcji stanowi polecenie SELECT! Nie używa nawiasów BEGIN END! RETURN specyfikuje zwracaną tablicę! Format (schemat) zwracanej tablicy jest określony przez format zbioru wynikowego
In-Line Table-valued Function! Tworzenie USE USE Northwind Northwind GO GO CREATE CREATE FUNCTION FUNCTION fn_customernamesinregion ( @RegionParameter @RegionParameter nvarchar(30) nvarchar(30) ) RETURNS RETURNS table table AS AS RETURN RETURN ( SELECT SELECT CustomerID, CustomerID, CompanyName CompanyName FROM FROM Northwind.dbo.Customers WHERE WHERE Region Region = @RegionParameter @RegionParameter )! Wywołanie SELECT SELECT * FROM FROM fn_customernamesinregion(n'wa')
Trigery
Triggery - wprowadzenie! Trigger to procedura specjalnego typu! Trigger: " jest związany z tabelą " jest wywoływany automatycznie nie można go wywołać w sposób bezpośredni " jest częścią transakcji która go wywołała
Użycie trigerów! Automatyczne wykonywanie operacji na powiązanych tabelach! Zapewnienie warunków integralności! Obsługa błędów! Obsługa zdenormalizowanych danych
Trigery Use Use Northwind GO GO CREATE TRIGGER Empl_Delete ON ON Employees FOR FOR DELETE AS AS IF IF (SELECT COUNT(*) FROM FROM Deleted) > 1 BEGIN RAISERROR( 'You 'You cannot delete more more than than one one employee at at a time.', 16, 16, 1) 1) ROLLBACK TRANSACTION END END
Modyfikacja i usuwanie USE USE Northwind GO GO ALTER TRIGGER Empl_Delete ON ON Employees FOR FOR DELETE AS AS IF IF (SELECT COUNT(*) FROM FROM Deleted) > 6 BEGIN RAISERROR( 'You 'You cannot delete more more than than six six employees at at a time.', 16, 16, 1) 1) ROLLBACK TRANSACTION END END
Trigery! INSERT Trigger! DELETE Trigger! UPDATE Trigger! INSTEAD OF Trigger
Triggers - przykłady! Zapewnienie integralności danych! Business Rules
Zapewnienie integralności danych CREATE CREATE TRIGGER TRIGGER BackOrderList_Delete ON ON Products Products FOR FOR UPDATE UPDATE AS AS IF IF (SELECT (SELECT BO.ProductID BO.ProductID FROM FROM BackOrders BackOrders AS AS BO BO JOIN JOIN Inserted Inserted AS AS I ON ON BO.ProductID BO.ProductID = I.Product_ID I.Product_ID ) > 0 BEGIN BEGIN DELETE DELETE BO BO FROM FROM BackOrders BackOrders AS AS BO BO INNER INNER JOIN JOIN Inserted Inserted AS AS I ON ON BO.ProductID BO.ProductID = I.ProductID I.ProductID END END Products ProductID UnitsInStock 1 15 15 2 15 10 Updated 10 3 65 65 4 20 20 Trigger Deletes Row BackOrders ProductID UnitsOnOrder 1 15 15 12 12 10 10 3 65 65 2 15
Business Rules Products with Outstanding Orders Cannot Be Deleted Products IF IF (Select (Select Count Count (*) (*) FROM FROM [Order [Order Details] Details] INNER INNER JOIN JOIN deleted deleted ON ON [Order [Order Details].ProductID = deleted.productid ) > 0 ROLLBACK ROLLBACK TRANSACTION TRANSACTION DELETE statement executed on Product table ProductID UnitsInStock 1 15 15 2 10 0 10 3 65 65 4 20 20 Trigger code checks the Order Details table Order Details OrderID ProductID UnitPrice Quantity Discount 10522 10523 10524 10525 10 10 2 41 41 7 31.00 19.00 9.65 9.65 30.00 7 9 24 24 Transaction rolled back 0.2 0.2 0.15 0.15 0.0 0.0 'Transaction 'Transaction cannot cannot be be processed' processed' 'This 'This product product has has order order history' history'