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:
- 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.