T-SQL

UPDATE pomocí aliasu tabulky

Napsat správně UPDATE příkaz může vypadat jako trivialita, ale opak je pravdou. Nehod, kdy se někomu nezadařilo a oprava dat ze záloh zabrala několik hodin, jsem zažil dost. Dnes si ukážeme alespoň drobné vylepšení, jak správně na UPDATE a věřím, že to leckomu z juniorů ušetří pár bezesných nocí:)

Kouzlo je v tom, že i UPDATE můžeme udělat proti aliasu tabulky, jak ukazuje následující příklad:

-- create sample table
CREATE TABLE dbo.SampleTable
(
    Id INT IDENTITY(1,1) NOT NULL,
    StrValue VARCHAR(10)
)
GO

-- insert sample data
INSERT dbo.SampleTable VALUES ('Value1')
INSERT dbo.SampleTable VALUES ('Value2')
INSERT dbo.SampleTable VALUES ('Value3')
GO

UPDATE STalias
    SET StrValue = 'Value1Upd' 
FROM dbo.SampleTable STalias
WHERE StrValue = 'Value1'
GO

SELECT * FROM dbo.SampleTable
GO

Vytvořili jsme si testovací tabulku a napsali proti ní UPDATE příkaz, kde jsme tabulce přiřadili alias STalias a ten odkazovali v UDPATE hlavičce. Na tom není složitého. A k čemu je to tedy dobré?

Podívejme se na následující UPDATE:

UPDATE dbo.[Employee]
	SET FirstName = 'AAA'
FROM ems.[Employee] [emp]
	INNER JOIN ems.[EmployeeStatus] [es] ON [es].[EmployeeStatus_ID] = [emp].[EmployeeStatus_ID]
WHERE emp.[EmployeeStatus_ID] = 3
GO

Napsali jsme si krásný příkaz, kterým chceme nastavit všem zaměstnancům se statusem 3 jejich [FirstName] na ‘AAA’. A co se stane po spuštění? Došlo ke změně dat. Ano, došlo. A dokonce se nastavilo [FirstName] na ‘AAA’. Ovšem nastavilo se všem zaměstnancům bez ohledu na jejich status , a to ještě v úplně jiné tabulce, která leží místo ve schématu [ems] ve schématu [dbo]. Drobné přehlédnutí a průšvih je na světě.

Jak tomu předejít? Velmi jednoduše právě pomocí aliasu tabulky a správného pořadí, v jakém budeme UPDATE sestavovat. Postupovat bychom měli takto:

  1. Nejprve si napíšeme SELECT tak, abychom dostali přesně ta data, která se chystáme změnit a provedeme vizuální kontrolu, že data opravdu odpovídají naší představě:
SELECT emp.[Employee_ID], emp.[FirstName]
FROM ems.[Employee] [emp]
	INNER JOIN ems.[EmployeeStatus] [es] ON [es].[EmployeeStatus_ID] = [emp].[EmployeeStatus_ID]
WHERE es.[EmployeeStatus_ID] = 3
GO

2. Vybereme správný alias tabulky a použijeme ho v UPDATE příkazu. SELECT si zakomentujeme pro pozdější opakované spuštění:

UPDATE [emp]
	SET [emp].[FirstName] = 'AAA'
--SELECT emp.[Employee_ID], emp.[FirstName]
FROM ems.[Employee] [emp]
	INNER JOIN ems.[EmployeeStatus] [es] ON [es].[EmployeeStatus_ID] = [emp].[EmployeeStatus_ID]
WHERE es.[EmployeeStatus_ID] = 3
GO

3. Spustíme znovu označením do bloku část dotazu se SELECT příkazem a zkontrolujeme, zda data jsou opravdu změněná podle očekávání.

4. Pokud pokračujeme ve stejném okně v psaní dalších příkazů, doporučuji zakomentovat si UPDATE a odkomentovat SELECT pro případ, že bychom omylem spustili znovu celý skript poté, co jsme si správnou část zapomněli označit do bloku:

--UPDATE [emp]
--	SET [emp].[FirstName] = 'AAA'
SELECT emp.[Employee_ID], emp.[FirstName]
FROM ems.[Employee] [emp]
	INNER JOIN ems.[EmployeeStatus] [es] ON [es].[EmployeeStatus_ID] = [emp].[EmployeeStatus_ID]
WHERE es.[EmployeeStatus_ID] = 3
GO

Vše jsou to pouze triviální operace, ale osvojit si tyto 4 kroky jako povinné pro každodenní práci znamená výraznou minimalizaci rizika, že to jedno dne nedopadne dobře. Úplně stejně můžeme pochopitelně postupovat v případě DELETE příkazu.

Leave a Reply

Your email address will not be published.