SQL Uprawnienia w tempdb

25-Wrz-2011

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 master
CREATE 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 a

Zobaczmy 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 tempdb
CREATE 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 master
CREATE 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!

O uprawnieniach w bazie danych opowiada kurs 6231. Kursy Microsoft Opole, Katowice, Warszawa. Zapraszam!

Sprawdź również inne artykuły na mobilo mobilo24.

Dodaj komentarz:

Autor: Rafał Kraik