SQL Server

Dočasné uložené procedury

Že je možné v SQL Serveru vytvářet také dočasné uložené procedury ví opravdu jen málo kdo. Ptám se na to s oblibou při náboru nových kandidátů a 9 z 10 se mne zeptá, že jsem měl zřejmě na mysli dočasné tabulky, případně začnou mluvit rovnou o nich. Tedy ano, opravdu můžeme v SQL Serveru vytvářet dočasné uložené procedury, ale měli bychom tak činit jen s dobrou znalostí jejich chování a řídit se doporučeními Microsoftu.

Dočasné uložené procedury (Temporary Stored Procedures) vytváříme stejně jako dočasné tabulky – přidáme před jejich jméno jeden nebo dva #. Podle toho se rozlišují na lokální a globální podobně jako dočasné tabulky:

  • lokální (#)
    • vytváříme je přidáním jednoho hashtagu (#) před jejich název
    • jsou vidítelné pouze v připojení (SPID) v rámci kterého byly vytvořeny
    • po zavření připojení jsou automaticky odstraněny
    • volat je může pouze jejich tvůrce – vlastník (což je logicky login, kterému patří aktivní připojení)
    • práva k jejich volání nelze přidělit jiným uživatelům
  •  globální (##)
    • vytváříme je přidání dvou hashtagů (##) před jejich název
    • jsou viditelné pro všechna připojení (SPIDs) dané instance
    • jsou odstraněny automaticky po uzavření posledního připojení, které je používalo
    • mohou je volat všichni uživatelé a toto právo není možné odebrat

Dočasné uložené procedury mohou vytvářet všichni uživatelné a toto právo nelze odebrat.

Příklad jednoduché lokální uložené procedury může vypadat například takto:

CREATE PROCEDURE #PrintMessageUpperCase (
	@Msg NVARCHAR(100)
)
AS
BEGIN
    
     PRINT UPPER(@Msg)

END
GO

EXECUTE [dbo].[#PrintMessageUpperCase] @Msg = N'Test Message'
GO

DROP PROCEDURE [dbo].[#PrintMessageUpperCase]
GO

Opravdu užitečné je použití dočasný uložených procedur v nejrůznějších scénářích nasazování databázových změn, kdy potřebujeme spouštět složitější skripty, případně dosáhnout žádoucího chování SQL Serveru tím, že kód obalíme uloženou procedurou. Stejně tak se výborně hodí pro testování různých optimalizací atd. Na konci nemusíme řešit čistění databáze od dočasných objektů.

Na co je třeba opravdu dávat pozor je bezpečnost: ke globálním dočasným uloženým procedurám nelze omezit právo EXECUTE a z jiné session tak může být spuštěn kód, ke kterému by se za normálních okolností uživatel nedostal.

Leave a Reply

Your email address will not be published.