Jak ukryć / wyłączyć tabele bez upuszczania ich w celu sprawdzenia redundancji?

12

Muszę zachować i rozszerzyć stary system, który zawiera metody usług sieciowych i tabele bazy danych, które nie są już używane. Ponieważ nie jestem do końca pewien, czy stoły są naprawdę zbędne, boję się je upuścić.

Czy istnieje inny sposób na osiągnięcie tego samego efektu (nie można już używać tabel) bez ich upuszczania? Mój pomysł był aby przenieść je do innego schematu (na przykład Deleted) z obecnego domyślnie dbo.

IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'Deleted')
BEGIN
   EXEC('CREATE SCHEMA Deleted')
END

ALTER SCHEMA Deleted TRANSFER dbo.TableName;

Czy jest jakaś inna opcja lub czy są jakieś wady podejścia do schematu?

Tim Schmelter
źródło

Odpowiedzi:

7

Czy istnieje inny sposób na osiągnięcie tego samego (nie można już używać tabel) bez ich upuszczania?

Zmiana schematu jest bardzo szybką operacją - wymagana jest tylko zmiana metadanych. Pierwotny pomysł, który wpadłem na pomysł, pochodzi z bloga Aarona Bertranda - Schema Switch-A-Roo .

Tutaj możesz wykonać kroki z mojej odpowiedzi

Oczywiście istnieją inne metody, takie jak sp_rename N'old table ', N'new table' lub po prostu odmawiają uprawnień do tabeli.

Kin Shah
źródło
Nie byłem pewien, jaką odpowiedź powinienem przyjąć, ponieważ wszystkie są pomocne. Nie znałem artykułu Aarona, więc zaakceptowałem go, ponieważ zawiera on więcej informacji (nawet jeśli tylko link).
Tim Schmelter,
@ TimSchmelter Cieszę się, że przydało ci się. Nie ma sensu powtarzać tutaj tego, co artykuł lub moja odpowiedź (link). Właśnie dlatego o tym wspomniałem.
Kin Shah
12

Kilka innych opcji to po prostu zmiana nazwy tabel lub, jeśli mają indeksy klastrowe, możesz wyłączyć indeks klastrowany.

Chad Mattox
źródło
Dzięki. Nie wiedziałem, że wyłączenie indeksu klastrowego powoduje, że tabela nie nadaje się do użytku. Jakie są zalety i wady tych podejść (+ schemat)?
Tim Schmelter
5
@ TimSchmelter Konsekwencją wyłączenia CI jest to, że aby ją ponownie włączyć, musisz odbudować indeks. Inną opcją jest odmowa uprawnień na stole do roli publicznej, chociaż właściciel bazy danych lub administratorzy sys nadal je zobaczą, a także prawdopodobnie poprzez łańcuch własności.
Martin Smith
Przed upuszczeniem tabeli lub upuszczeniem kolumny z tabeli często zmieniam jej nazwę, dodając „_deprecated” lub inne podobne na końcu nazwy. Jeśli więc nie ma błędów, nic nie może się do niego odnosić.
Jay
Zmiany uprawnień są przypadkowe. Jeśli konto usługi, na którym działa aplikacja, to dbo lub, co gorsza, sysadmin, to całkowicie zignoruje każdy rodzaj DENY. Mam nadzieję, że nie są, ale tak się dzieje.
Kenneth Fisher
6

Usuń uprawnienia w tabeli z Roli / Grup / Kont / Kont, które mogą z niego korzystać.

Jeśli coś wybuchnie, odłóż je z powrotem [szybko].

Wskazówka: użycie skryptu do wprowadzenia tych zmian byłoby naprawdę dobrym pomysłem.

Phill W.
źródło
Podobnie jak testowanie w nieprodukcyjnej bazie danych. ;) Mam nadzieję, że było to jednak oczywiste dla PO.
jpmc26
@ jpmc26. najpierw przetestuję w nieprodukcyjnej bazie danych. Problem polega jednak na tym, że chcę wiedzieć, czy funkcje lub obiekty bazy danych są używane z zewnątrz (nie tylko za pomocą metod webservice, ale także bezpośrednio w bazie danych lub narzędziach administracyjnych w innych lokalizacjach firmy).
Tim Schmelter,
Hm Jeśli szukasz bezpośredniego dostępu do DB przez DBA, wygląda na to, że logowanie jest w porządku. Może nie być bardzo prawdopodobne, że zobaczysz to samo użycie w prod i non-prod z pracy ręcznej. Nie jestem do końca pewien, jak łatwo byłoby zalogować te operacje, ale gdybyś miał produkt do logowania, mógłbyś go przeanalizować, aby znaleźć zastosowania.
jpmc26
@ jpmc26: okej, jeśli ci administratorzy upadną na twarz, zgłoszą to. Nie jest to w porządku dla klientów, ale można to sprawdzić w systemie testowym przed wdrożeniem.
Tim Schmelter,
3

Usunięcie uprawnień na ogół nie zadziała, ponieważ nie możesz BYĆ PEWNY, że ktoś nie ma uprawnień. Być może poprzez grupę, rolę, a nawet dlatego, że są administratorami (choć miejmy nadzieję, że nie).

W przypadku tabel możesz je wyłączyć. I to jest szybki proces. Jednak aby je włączyć, musisz je odbudować i mieć duży stół, co może zająć sporo czasu.

Najlepszym rozwiązaniem będzie przeniesienie obiektu do nowego schematu (zgodnie z sugestią) lub zmiana nazwy obiektu. Obie te operacje są szybkie i łatwe zarówno do wykonania, jak i cofnięcia. Uprawnienia będą również obowiązywać w obu kierunkach.

Dodatkowym krokiem, jaki możesz zrobić, jest dodanie „notatki TBD” w rozszerzonych właściwościach obiektu. Możesz zanotować datę wprowadzenia zmiany i / lub wszelkie uwagi na temat tego, dlaczego uważasz, że można się go bezpiecznie pozbyć.

Wszystko to powiedziało, że przez kilka dni prowadzę sesję zdarzeń rozszerzonych (lub śledzenie profilera), aby mieć pewność, że wszystkie obiekty są używane. Możesz mocno ograniczyć sesję do samej nazwy obiektu i kiedy go dotknięto, aby zmniejszyć narzut. Upewnij się również, że prowadzisz tę sesję przez kilka dni po obu stronach końca miesiąca, a być może nawet pod koniec kwartału, aby mieć pewność, że masz wszystko.

Kenneth Fisher
źródło
3

Usuń uprawnienia, jak sugeruje Phil W.

Usuń także uprawnienia z procedur przechowywanych korzystających z tabel. W SQL Server (nie wiem o innych) uprawnienia są łączone z obiektu wywołującego (np. Procedura składowana) do obiektu wywoływanego (np. Tabela).

Peter Bill
źródło
Zadanie polegało na tym, aby wszystkie narzędzia, funkcje, obiekty, zapytania (nawet w zdalnych bazach danych) zawiodły, próbując uzyskać dostęp do tych tabel. Jeśli muszę zmodyfikować procedurę składowaną, muszę już wiedzieć, że z niej korzysta. Czy jest jakiś prosty sposób na określenie, czy tabela jest używana przez procedurę przechowywaną?
Tim Schmelter
Nie zasugerowałem modyfikacji procedury przechowywanej, tylko usunięcie jej uprawnienia EXECUTE. Jak mówisz, w razie potrzeby łatwo jest przywrócić uprawnienia. Możesz zobaczyć, jakie tabele są używane przez procedurę przechowywaną: W SQL Server Management Studio, Object Explorer, wybierz bazę danych -> Programowalność -> Procedury składowane. Kliknij prawym przyciskiem myszy nazwę sproc i wybierz polecenie Wyświetl zależności. Wybierz obiekty, od których zależy [nazwa sproc].
Peter Bill