Z czego właściwie wynika jakie mamy uprawnienia w bazie danych tempdb? Z jednej strony wydawałoby się, że jet to taki obiekt, gdzie każdy powinien móc prawie wszystko, czyli upraniwnienia powinny być duże, a z drugiej strony wszystko musi być uregulowane jakimiś uprawnieniami.
Jeżeli zajrzysz do Security w bazie danych tempdb, to zobaczysz, że rola public, do której powinni należeć wszyscy użytkownicy ma prawo SELECT. Jak więc to się dzieje, że będąc zwykłym użytkownikiem mogę coś utworzyć w tempdb?
Zobacz. Poleceniem
USE masterCREATE LOGIN [a] WITH PASSWORD=’a’
DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
tworzę login dla konta a, teraz dodatkowo utworzę dla niego konto użytkownika w bazie danych master:
CREATE USER a FOR LOGIN aZobaczmy co może ten uzytkownik?
EXECUTE AS USER=’a’USE tempdb
CREATE TABLE atab(a char(10))
–TUTAJ JEST BŁĄD
USE master
REVERT
Widać, więc że użytkownik a nie otrzymawszy żadnych specjalnych uprawnień nie może tworzyć obiektów w tempdb. Nadajmy mu więc uprawnienia:
USE tempdbCREATE USER a FOR LOGIN a
EXEC sp_addrolemember 'db_ddladmin’, 'a’
EXEC sp_addrolemember 'db_datawriter’, 'a’
Sprawdzamy, co teraz może ten użytkownik:
EXECUTE AS USER=’a’USE tempdb
CREATE TABLE atab(a char(10))
–UDAŁO SIE
REVERT
Czy należy zatem nadawać uprawnienia użytkownikom, aby mogli tworzyć obeikty w tempdb? Cóż, pamiętaj, że nawet jeśli to zrobisz to po najbliższym restarcie serwera baza danych tempdb zostanie usunięta i utworzona na nowo i uprawnienia zostaną utracone. Można to obejść tworząc w SQL Server Agencie zadanie uruchamiane zaraz po uruchomieniu agenta, które będzie w takiej nowej bazie danych zgodnie z Twoją logiką ustawiać upranwienia. Ale, zastanówmy się czy tak będzie dobrze. Czy aby w tempdb nie należy tworzyć obiektów tymczasowych? Czy do tego są nam potrzebne dodatkowe uprawnienia?
Zobacz tworzę login:
USE masterCREATE LOGIN b WITH PASSWORD=’b’
DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
Teraz jako ten użytkownik spróbuję utworzyć obiekt tymczasowy:
EXECUTE AS USER=’b’CREATE TABLE #tmp(b char(10))
–UDAŁO SIĘ
REVERT
Podsumowując. Stałe tabele należy tworzyć w swojej bazie danych. Tworzeniem obiektów tymczasowych zajmie się za Ciebie serwer, tylko zaznacz, że tworzony obiekt jest tymczasowy!
Sprawdź również inne artykuły na mobilo mobilo24.