DROP IF

https://xpil.eu/3tp

Microsoft to dobra firma, ale czasem jak już coś wymyślą, to nie wiadomo, śmiać się czy pakować walizki.

Tym razem poszło o słynne oraclowe "CREATE OR REPLACE". Najwyraźniej chłopaki z M$ bardzo mocno starają się nie wejść z prawie czterdziestoletnim gigantem w konflikt, dlatego zamiast, jak to drzewiej bywało, kraść pomysł z sąsiedniego podwórka, wymyślili po swojemu.

Chwali się, owszem. Ale, kurdę, jednak mogliby to nieco lepiej rozwiązać.

No bo tak: jeżeli chcemy zmodyfikować jakiś obiekt w bazie danych, wypadałoby najpierw sprawdzić, czy obiekt ów istnieje, i jeżeli tak, to go skasować i utworzyć na nowo, a jeżeli nie, to go po prostu utworzyć. Albo odwrotnie: jeżeli już istnieje, to go zmienić, a jeżeli nie istnieje, to go utworzyć:

Programiści od dawien dawna posługiwali się konstrukcjami typu:

Podejście numer 1:

IF OBJECT_ID('[nazwa procedury]') IS NOT NULL
EXECUTE('DROP PROCEDURE [nazwa procedury]');

GO

CREATE PROCECURE [nazwa procedury] AS
--tu piszemy co trzeba

Albo:

Podejście numer 2:

IF OBJECT_ID('[nazwa procedury]') IS NULL
EXECUTE('CREATE PROCEDURE [nazwa procedury] AS SELECT 0 zero;');

GO

ALTER PROCECURE [nazwa procedury] AS
--tu piszemy co trzeba

Moim zdaniem podejście numer 2 (a więc: tworzymy "pusty" obiekt jeżeli jeszcze nie istnieje, a następnie robimy ALTER) jest o niebo lepsze, ponieważ jeżeli z obiektem są skojarzone jakieś uprawnienia, przy podejściu numer 1 zostaną one utracone i trzeba je będzie odtwarzać, natomiast przy podejściu numer 2 niczego nie tracimy.

w Oracle od dawien dawna jest możliwa taka konstrukcja:

CREATE OR REPLACE PROCEDURE [nazwa procedury] AS
--tu piszemy co trzeba

I gotowe - jeżeli procedura nie istniała, zostanie utworzona, a jeżeli istniała, zostanie zmieniona (bez uprzedniego kasowania). Wszyscy są zadowoleni.

A co wymyślili chłopcy z M$ w wersji 2016?

Jakże by inaczej:

DROP PROCEDURE IF EXISTS [nazwa procedury]

Niby fajnie, łatamy "dziurę" i nie musimy już sprawdzać niczego za pomocą OBJECT_ID - możemy po prostu warunkowo skasować procedurę (sprawdzenie czy ona istnieje czy nie zostanie przeprowadzone niejako "w tle", przez operator IF EXISTS). To tak zwany "syntactic sugar" dla wymienionego wcześniej podejścia numer 1.

Tego gorszego.

To lepsze podejście, dzięki któremu nie musimy kasować obiektu, żeby go zmodyfikować, nie ma niestety odzwierciedlenia w nowej składni TSQL.

A szkoda.

https://xpil.eu/3tp

Leave a Comment

Komentarze mile widziane.

Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]

Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.