tárolt eljárások · 2019. 3. 10. · tárolt eljárások előnyei Átláthatóság: egy helyen...

53
Tárolt eljárások

Upload: others

Post on 21-Oct-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

  • 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