Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
Tárolt eljárások
Tárolt eljárások
A tárolt eljárások az SQL szerver adatbázisában tárolt Transact-SQl utasításhalmazok
SQL utasítások gyűjteménye, ami egy feladatot valósít meg, paraméterezhetőek, saját egyedi azonosító nevük van és az adatbázisban lefordított formában eltárolásra kerülnek
A tárolt eljárások ugyanúgy viselkednek, mint más programozási nyelvek eljárásai. Vagyis paraméterezhetők és visszatérési értékeket szolgáltathatnak a hívó eljárás felé; utasításokat tartalmaznak; további tárolt eljárásokat hívhatnak meg.
Tárolt eljárások előnyei
● Biztonsági funkció:
Futtatási jog a tárolt eljárásra
Nem kell a táblákra jogosultságot adnunk, hanem elég az eljárásra
Elrejti az adatbázis szerkezeti megvalósítását a user elől ● Teljesítmény:
kevesebb információt kell átküldeni a hálózaton
Tárolt eljárások előnyei● Átláthatóság: Egy helyen koncentrálódik minden adatbázis-
lekérdezés, így könnyebb megtalálni az esetleges hibásakat is ● Könnyen frissíthető: amennyiben a rendszer felépítése egy szerver-
több kliens jellegű, a végfelhasználóknak szánt kliens esetleges hibájának kijavítása idő, és költségigényes lehet (természetesen, amennyiben a lekérdezések általi hibáról van szó).
Tárolt eljárások esetén a lekérdezés nem a kliensben tárolódik, könnyebben lehet frissíteni azokat (a végfelhasználók közreműködése, illetve új kliens verziók telepítése nélkül is)
● Teljesítmény:
kevesebb információt kell átküldeni a hálózaton
Tárolt eljárások csoportosítása
A tárolt eljárásokat három csoportba oszthatjuk:● rendszerszintű tárolt eljárások (system stored procedure),
amelyek jórészt az SQL Server adminisztrációját segítik elő. Ezeket az eljárásokat megkapjuk az SQL Serverrel együtt. A master adatbázisban találhatók
● felhasználói tárolt eljárások (user-defined stored procedure) :Ezeket mi írjuk és a saját adatbázisunkban tároljuk őket.
● felhasználói rendszerszintű tárolt eljárás (user-defined system stored procedure): mi írunk, de a master adatbázisban tárolunk, ezáltal minden adatbázisból hozzáférhetők.
Tárolt eljárás létrehozása és futtatása
CREATE PROCEDURE
1. SQL server először parsolja, értelmezi az utasításokat, hogy szintaktikailag helyesek -e
2, Ha nem akkor hibaüzenetet kapunk
3, Ha igen, akkor: a tárolt eljárás neve a sysobjects táblába kerül. Az eljárás szövege, vagyis az utasítások a syscomments táblába, a normalizált terv pedig a sysprocedures táblába.
Tárolt eljárás létrehozása és futtatása
Első futtatás során:
1. A terv a memóriába töltődik és lefordítódik
A lefordított eljárás az eljátás cache-be, az SQL server memória-pufferébe kerül (ott is marad az SQL Server újraindításáig), és innen hajtódik végre
Tárolt eljárás létrehozása és futtatása
Elhalasztott névfeloldás (Deferred Name Resolution):● A tárolt eljárás létrehozásakor a benne hivatkozott
objektumoknak még nem kell létezniük● Első futtatáskor kerülnek megvizsgálásra, hogy
léteznek -e
Ha egy objektum neve megváltozott vagy törlődött, akkor hibát kapunk a tárolt eljárás futtatásakor.
De ha töröltük az objektumot és létrehoztunk egy másikat ugyanezzel a névvel, akkor nem kell újra lefordítani.
Felhasználói tárolt eljárásokCREATE [ OR ALTER ] { PROC | PROCEDURE }
[schema_name.] procedure_name [ ; number ]
[ { @parameter [ type_schema_name. ] data_type }
[ VARYING ] [ = default ] [ OUT | OUTPUT | [READONLY]
] [ ,...n ]
[ WITH [ ,...n ] ]
[ FOR REPLICATION ]
AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }
[;]
::=
[ ENCRYPTION ]
[ RECOMPILE ]
[ EXECUTE AS Clause ]
Tárolt eljárás neve
Tárolt eljárás nevének egyedinek kell lenni egy sémán belül
eljárás neve maximálisan 128 karakter hosszúságú
globális ideiglenes tárolt eljárás neve maximum 128 karakter a ##-et beleértve
lokális ideiglenes tárolt eljárás neve maximum 116 karakter a #-et beleértve
Eljárás nevére az azonosítókkal kapcsolatos előírások vonatkoznak
Tárolt eljárás paraméterei
@-al kezdődnek
Lehetnek bemeneti és kimeneti
Paraméterek adattípusa az összes Transact-SQL adattípus lehet
Lokálisak → egy másik eljárásban használható ugyanaz az elnevezés
paraméterek száma maximum 1200
Cursor adattípus csak kimeneti paraméter lehet (VARYING kulcsszót kell használni)
Default: alapértelmezett értéket adhatunk meg a paraméternek
ENCRYPTION
az SQL Server a tárolt eljárás utasításait kódolva tárolja a syscomments táblába, így azokat más nem tudja elolvasni
Ha nem titkosítjuk az eljárást, az sp_helptext tárolt eljárással nézhetjük meg a szövegét
RECOMPILE
1. Tárolt eljárás kódjában szerepel WITH RECOMPILE
2. EXECUTE utasításban
Példa:
USE AdventureWorks2012;
GO
EXECUTE HumanResources.uspGetAllEmployees WITH RECOMPILE;
GO 3. sp_recompile tárolt eljárás használatával
nem futtatja a tárolt eljárást, hanem megjelöli újrafordítandóként, és a következő EXECUTE esetében újrafordítódik.
Példa:
USE AdventureWorks2012;
GO
EXEC sp_recompile N'HumanResources.uspGetAllEmployees';
GO
EXECUTE AS Clause
{ EXEC | EXECUTE } AS { CALLER | SELF | OWNER | 'user_name' }
● CALLER: aki a tárolt eljárást meghívta● SELF: aki létrehozta, vagylegutoljára
módosította a tárolt eljárás● OWNER: tárolt eljárás tulajdonosa vagy tárolt
eljárás sémájának a tulajdonosa● 'user_name': felhasználó neve
EXECUTE AS Clause
Példa:
CREATE PROCEDURE dbo.usp_Demo2
AS
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].table_2') AND type in (N'U'))
CREATE TABLE table_2 (id int, data nchar(10))
INSERT INTO table_2
SELECT top 5 * from dbo.table_1;
GO
GRANT EXEC ON dbo.usp_Demo2 TO test;
GO
EXEC dbo.usp_Demo2;
EXECUTE AS ClausePélda:
CREATE PROCEDURE dbo.usp_Demo2
WITH EXECUTE AS OWNER
AS
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].table_2') AND type in (N'U'))
CREATE TABLE table_2 (id int, data nchar(10))
INSERT INTO table_2
SELECT top 5 * from dbo.table_1;
GO
GRANT EXEC ON dbo.usp_Demo1 TO test;
GO
EXEC dbo.usp_Demo1
Ideiglenes tárolt eljárás
Tempdb adatbázisban jönnek létre: SQL Server újraindításakor megszűnnek
Lokális ideiglenes tárolt eljárás:
csak az a kapcsolat használhatja az ideiglenes lokális tárolt eljárást, amelyik létrehozta, és az eljárás automatikusan megszűnik a kapcsolat bomlásakor
Globális ideiglenes tárolt eljárás:
minden más kapcsolat felhasználói is használhatják egészen addig, amíg az őt létrehozó felhasználó kapcsolata él. Ha ez a kapcsolat megszakad, más felhasználó már nem éri el az eljárást, de csak akkor szűnik meg, ha az utolsó őt használó felhasználó is lecsatlakozott.
Tárolt eljárás létrehozása
CREATE PROCEDURE● Az alábbiak kivételével az összes SQL utasítást
tartalmazhatja:– CREATE DEFAULT, CREATE TRIGGER, CREATE
PROCEDURE, CREATE VIEW, CREATE RULE.● Szükséges jogosultságok:
CREATE PROCEDURE jogosultság az adatbázisban és ALTER jogosultság a sémára, amelyben a tárolt eljárást létrehozzuk
Tárolt eljárás létrehozásaPélda:
USE AdventureWorks2012;
GO
CREATE PROCEDURE HumanResources.uspGetEmployeesTest2
@LastName nvarchar(50),
@FirstName nvarchar(50)
AS
SET NOCOUNT ON;
SELECT FirstName, LastName, Department
FROM HumanResources.vEmployeeDepartmentHistory
WHERE FirstName = @FirstName AND LastName = @LastName
AND EndDate IS NULL;
GO
Tárolt eljárás futtatása
EXECUTE jogosultság a tárolt eljárásra
Példa:
1. EXECUTE HumanResources.uspGetEmployeesTest2 N'Ackerman', N'Pilar';
2. EXEC HumanResources.uspGetEmployeesTest2 @LastName = N'Ackerman', @FirstName = N'Pilar';
GO
3. EXECUTE HumanResources.uspGetEmployeesTest2 @FirstName = N'Pilar', @LastName = N'Ackerman';
GO
Tárolt eljárás módosítása
ALTER PROCEDURE
Szükséges jogosultság: ALTER PROCEDURE jogosultság a tárolt eljárásraPélda:
USE AdventureWorks2012;
GO
ALTER PROCEDURE HumanResources.uspGetEmployeesTest2
@LastName nvarchar(50),
@FirstName nvarchar(50)
AS
SET NOCOUNT ON;
SELECT FirstName, LastName, JobTitle, Department, StartDate
FROM HumanResources.vEmployeeDepartmentHistory
WHERE FirstName = @FirstName AND LastName = @LastName
AND EndDate IS NULL;
GO
Tárolt eljárás törlése
Szükséges jogosultság:
ALTER jogosultság a sémára vagy CONTROL jogosultság a tárolt eljárásra
DROP PROCEDURE ;
GO
Tárolt eljárás példaCREATE PROCEDURE SampleProcedure @EmployeeIDParm INT,
@MaxTotal INT OUTPUT
AS
-- Declare and initialize a variable to hold @@ERROR.
DECLARE @ErrorSave INT
SET @ErrorSave = 0
-- Do a SELECT using the input parameter.
SELECT FirstName, LastName, JobTitle
FROM HumanResources.vEmployee
WHERE EmployeeID = @EmployeeIDParm
-- Save any nonzero @@ERROR value.
IF (@@ERROR 0)
SET @ErrorSave = @@ERROR
Tárolt eljárás példa
SELECT @MaxTotal = MAX(TotalDue)
FROM Sales.SalesOrderHeader;
IF (@@ERROR 0)
SET @ErrorSave = @@ERROR
-- Returns 0 if neither SELECT statement had an error; otherwise, returns the last error.
-- Set a value in the output parameter.
RETURN @ErrorSave
GO
Tárolt eljárás példa
-- Declare the variables for the return code and output parameter.
DECLARE @ReturnCode INT
DECLARE @MaxTotalVariable INT
-- Execute the stored procedure and specify which variables
-- are to receive the output parameter and return code values.
EXEC @ReturnCode = SampleProcedure @EmployeeIDParm = 19,
@MaxTotal = @MaxTotalVariable OUTPUT
-- Show the values returned.
PRINT ' '
PRINT 'Return code = ' + CAST(@ReturnCode AS CHAR(10))
PRINT 'Maximum Quantity = ' + CAST(@MaxTotalVariable AS CHAR(10))
GO
Rendszerszintű tárolt eljárások
A rendszerszintű tárolt eljárások sp_ prefix-el kezdődnek
sp_ prefixel kezdődő eljárások esetén:
- először a master adatbázisban keresi
- ha nem találta, akkor a dbo adatbázisban
- végül a lokális adatbázisban
Rendszerszintű tárolt eljárások
sp_ prefix névvel ne hozzunk létre tárolt eljárásokat
Példa:
1. master adatbázisban levő hívódik meg
Use DatabaseA
EXEC sp_configure
2. expliciten megadtuk a tárolt eljárás elérését
Use DatabaseA
EXEC DatabaseA.dbo.sp_configure
Rendszerszintű tárolt eljárások
sp_databases: Az SQL szerver adatbázisainak lekérdezése
nincs paramétere
Rendszerszintű tárolt eljárások
sp_stored_procedures: Adatbázis tárolt eljárásainak lekérdezése sp_stored_procedures [ [ @sp_name = ] 'name' ]
[ , [ @sp_owner = ] 'schema']
[ , [ @sp_qualifier = ] 'qualifier' ]
[ , [@fUsePattern = ] 'fUsePattern' ]
Rendszerszintű tárolt eljárások
sp_stored_procedures
Példák:
USE AdventureWorks2012;
GO
EXEC sp_stored_procedures;
USE AdventureWorks2012;
GO
EXEC sp_stored_procedures N'uspLogError', N'dbo', N'AdventureWorks2012', 1;
Rendszerszintű tárolt eljárások
sp_tables: egy adatbázis tábláinak lekérdezésesp_tables [ [ @table_name = ] 'name' ]
[ , [ @table_owner = ] 'owner' ]
[ , [ @table_qualifier = ] 'qualifier' ]
[ , [ @table_type = ] "type" ]
[ , [@fUsePattern = ] 'fUsePattern'];
Rendszerszintű tárolt eljárások
sp_tables
Rendszerszintű tárolt eljárások
sp_tables
Példák:
1. EXEC sp_tables ;
2. USE AdventureWorks2012;
GO
EXEC sp_tables
@table_name = '%',
@table_owner = 'Person',
@table_qualifier = 'AdventureWorks2012';
Rendszerszintű tárolt eljárások
sp_columns: Tábla oszlopainak lekérdezése
sp_columns [ @table_name = ] object
[ , [ @table_owner = ] owner ]
[ , [ @table_qualifier = ] qualifier ]
[ , [ @column_name = ] column ]
Rendszerszintű tárolt eljárások
sp_columns
Példák:
1. EXEC sp_columns @table_name ='%'
2. USE AdventureWorks2012;
GO
EXEC sp_columns @table_name = N'Department',
@table_owner = N'HumanResources';
Rendszerszintű tárolt eljárások
sp_special_columns: Tábla speciális mezőinek lekérdezése
sp_special_columns [@name =] 'name'
[,[owner =] 'owner']
[,[@qualifier =] 'qualifier']
[,[@col_type =] 'col_type']
Rendszerszintű tárolt eljárások
sp_special_columns
Példa:USE AdventureWorks2012;
GO
EXEC sp_special_columns @table_name = 'Department'
,@table_owner = 'HumanResources';
Rendszerszintű tárolt eljárások
sp_pkeys: elsődleges kulcsinformációk lekérdezése
sp_pkeys [ @table_name = ] 'name'
[ , [ @table_owner = ] 'owner' ]
[ , [ @table_qualifier = ] 'qualifier' ]
Keresési maszk nem engedélyezett
Rendszerszintű tárolt eljárások
sp_pkeys
Példa:USE AdventureWorks2012;
GO
EXEC sp_pkeys @table_name = N'Department'
,@table_owner = N'HumanResources';
Rendszerszintű tárolt eljárások
sp_fkeys: elsődleges kulcsinformációk lekérdezése
sp_fkeys [ @pktable_name = ] 'pktable_name'
[ , [ @pktable_owner = ] 'pktable_owner' ]
[ , [ @pktable_qualifier = ] 'pktable_qualifier' ]
{ , [ @fktable_name = ] 'fktable_name' }
[ , [ @fktable_owner = ] 'fktable_owner' ]
[ , [ @fktable_qualifier = ] 'fktable_qualifier' ]
Rendszerszintű tárolt eljárások
sp_fkeys
Példa:USE AdventureWorks2012;
GO
EXEC sp_fkeys @pktable_name = N'Department'
,@pktable_owner = N'HumanResources';
Rendszerszintű tárolt eljárások
sp_server_info: adatbázis-szerver tulajdonságainak lekérdezése
sp_server_info [[@attribute_id =] 'attribute_id']Tábla nevének maximális hossza.
Oszlop nevének maximális hossza
Táblák átnevezhetők -e
Oszlopok átnevezhetők -e
mezők törölhetők -e
tárolt eljárások átnevezhetők -e stb.
Rendszerszintű tárolt eljárások
sp_table_privileges: Egy tábla privilégiumainak lekérdezése
sp_table_privileges [ @table_name_pattern = ] 'table_name_pattern'
[ , [ @table_owner_pattern = ] 'table_owner_pattern' ]
[ , [ @table_qualifier = ] 'table_qualifier' ]
Rendszerszintű tárolt eljárások
sp_table_privileges
USE AdventureWorks2012; GO EXEC sp_table_privileges @table_name = 'Contact%';
Rendszerszintű tárolt eljárások
sp_column_privileges: oszlop privilégiumainak lekérdezése
sp_column_privileges [ @table_name = ] 'table_name'
[ , [ @table_owner = ] 'table_owner' ]
[ , [ @table_qualifier = ] 'table_qualifier' ]
[ , [ @column_name = ] 'column' ]
Rendszerszintű tárolt eljárások
sp_column_privileges
USE AdventureWorks2012; GO EXEC sp_column_privileges @table_name = 'Employee' ,@table_owner = 'HumanResources' ,@table_qualifier = 'AdventureWorks2012' ,@column_name = 'SalariedFlag';
Rendszerszintű tárolt eljárások
sp_help: Információszerzés objektumokról
Példák:
1. USE master;
GO
EXEC sp_help;
GO
2.
USE AdventureWorks2012;
GO
EXEC sp_help 'Person.Person';
GO
Rendszerszintű tárolt eljárások
sp_attach_db: Adatbázis csatlakoztatása az MS SQL szerverhez
sp_attach_db [ @dbname = ] 'dbname'
, [ @filename1 = ] 'filename_n' [ ,...16 ]
Példa:
EXEC sp_attach_db @dbname = N'AdventureWorks2012',
@filename1 =
N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Data\AdventureWorks2012_Data.mdf',
@filename2 =
N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Data\AdventureWorks2012_log.ldf';
Rendszerszintű tárolt eljárások
sp_detach_db:Adatbázis leválasztása a szerverről
sp_detach_db [ @dbname = ] 'dbname'
[ , [ @skipchecks = ] 'skipchecks' ]
Példa:
EXEC sp_detach_db 'AdventureWorks2012', 'true';
Rendszerszintű tárolt eljárások
sp_renamedb: Adatbázis átnevezése
sp_renamedb [ @dbname = ] 'old_name' ,
[ @newname = ] 'new_name'
Példa:
USE master;
GO
CREATE DATABASE Accounting;
GO
EXEC sp_renamedb N'Accounting', N'Financial';
GO
Rendszerszintű tárolt eljárások
sp_rename: Adatbázis objektumok átnevezésesp_rename [ @objname = ] 'object_name' ,
[ @newname = ] 'new_name'
[ , [ @objtype = ] 'object_type' ]
@objtype paraméter opcionális
Rendszerszintű tárolt eljárások
sp_renamePéldák:
1.
USE AdventureWorks2012;
GO
EXEC sp_rename 'Sales.SalesTerritory', 'SalesTerr';
GO
2.
USE AdventureWorks2012;
GO
EXEC sp_rename 'Sales.SalesTerritory.TerritoryID', 'TerrID', 'COLUMN';
GO
Rendszerszintű tárolt eljárások
sp_renamePéldák:
1.
USE AdventureWorks2012;
GO
EXEC sp_rename 'Sales.SalesTerritory', 'SalesTerr';
GO
2.
USE AdventureWorks2012;
GO
EXEC sp_rename 'Sales.SalesTerritory.TerritoryID', 'TerrID', 'COLUMN';
GO
Slide 1Slide 2Slide 3Slide 4Slide 5Slide 6Slide 7Slide 8Slide 9Slide 10Slide 11Slide 12Slide 13Slide 14Slide 15Slide 16Slide 17Slide 18Slide 19Slide 20Slide 21Slide 22Slide 23Slide 24Slide 25Slide 26Slide 27Slide 28Slide 29Slide 30Slide 31Slide 32Slide 33Slide 34Slide 35Slide 36Slide 37Slide 38Slide 39Slide 40Slide 41Slide 42Slide 43Slide 44Slide 45Slide 46Slide 47Slide 48Slide 49Slide 50Slide 51Slide 52Slide 53