Zugriffsrechte TempDB

kwakz

Aktiver Benutzer
Beiträge
29
Hallo zusammen,

ich habe eine Datenbank, in der ich Kennlinien als varbinary ablege. Als GUI zur Auswertung der Kennlinien für den Benutzer habe ich ein LabVIEW-Programm, in dem ich verschiedene Filter setzen kann (z.B. Einschränkung auf bestimmten Auswertezeitraum, nur IO-Teile usw.). Bisher war mein Vorgehen folgendes: Aus LabVIEW heraus schicke ich ein Statement an die Datenbank, mit dem die Kennlinien gemäß der gesetzten Filter zusammengesucht werden. Die gefundenen Daten werden in eine Tabelle geschrieben, die ich vorher explizit im tempdb-Bereich erstelle. Das tue ich, weil ich anschließend nur noch mit diesen gefilterten Daten arbeiten will (z.B. soll ein Durchklicken durch die einzelnen Kennlinien, aber auch eine Darstellung des gesamten Tabelleninhalts möglich sein).
Jetzt besteht aber folgende Problematik: Jedes Mal, wenn die Datenbank oder der dazugehörige Server neu gestartet werden muss, sind auch alle Berechtigungen der tempdb weg ... dem jeweiligen Benutzer wird dann angezeigt, dass er keine Berechtigung besitzt, in der tempdb eine Tabelle zu erstellen.
Nun gibt es ja noch andere Möglichkeiten für temporäre Tabellen ... in Form von #Table und ##Table. Die Variante ##Table fällt meiner Meinung nach weg, weil dort alle angemeldeten User Zugriff haben ... Sprich: während ein User mit der temporären Tabelle arbeitet, kann es passieren, dass sie von einem anderen User überschrieben wird.
Mit der Variante #Table habe ich aber auch so meine Probleme ... womit ich dann auch zu meinen Fragen komme: Gibt es eine Möglichkeit, dass #Table nicht nur innerhalb eines Statements gültig ist? Ich würde halt gern weiterhin die gefilterten Daten erst in einen Extrabereich packen und dann nur damit weiterarbeiten.
Als völlig anderes Konzept fällt mir nur noch ein, den Neustart der Datenbank mit einem Script zu kombinieren, das anschließend die Berechtigungen für die einzelnen User wieder neu setzt.

Gruß Daniel
 
Werbung:
Hallo Daniel,

die TempDB ist eigentlich eine systemeigene Datenbank des SQL-Servers, in dem aus User-Sessions erzeugte Elemente temporär angelegt werden.
Man kann diese zwar bedingt wie eine normale Datenbank nutzen, wie du es gemacht hast, aber es gibt Eigenschaften in dieser Datenbank, die gegen eine explizite Verwendung sprechen.
Einige hast du ja bereits selbst entdeckt und in deinem Thread erwähnt.

Hier ist ein Link, der die interne Verwendung und die Einschränkungen der TempDB erklärt:
https://msdn.microsoft.com/de-de/library/ms190768.aspx

Was die Anlage von temporären Tabellen mit "#" oder "##" betrifft:
temporäre Tabellen, die innerhalb einer Session genutzt werden sollen, werden mit einem einfachen "#" angelegt.
Diese sind nur über diese Session ansprechbar und werden in der TempDB zwar angelegt, sind aber für diese Session und damit auch für den angemeldeten Anwender gekapselt.
Ein Zugriff aus einer anderen Session und somit auch für einen anderen User ist zwar theoretisch möglich, praktisch aber nur sehr schwer zu realisieren.
Die temporäre Tabelle wird mit kryptischen Namen aus einem zufällig generierten Key erzeugt. Man muss also raten, welche Tabelle für diese Abfrage in der Session erzeugt wurde.
Eine so angelegte temporäre Tabelle ist so lange existent, bis die Session, also die Verbindung zum SQL-Server beendet wird.

temporäre Tabellen können auch Session-Übergreifend und somit auch für andere User zugreifbar angelegt werden. Dies geschieht durch eine Anlage mit "##". Hier muss man jedoch beachten, dass diese temporäre Tabelle ebenfalls gelöscht wird, wenn die Session beendet wird, in der diese temporäre Tabelle erzeugt wurde.
Bei dieser Art von temporärer Tabelle muss man aber beachten, dass diese mit einem Namen auch nur einmal angelegt werden kann. Wird also von zwei Anwendern der gleiche Name einer solchen Tabelle erzeugt, wird es eine Fehlermeldung geben.

Solche temporären Tabellen sind also für eine einmal aufgebaute Verbindung verfügbar.

Wenn du explizit eine Tabelle in der TempDB erstellt, was spricht denn dann dagegen diese Tabelle in einer regulären Datenbank zu erstellen?
(Allerdings frage ich mich bei deiner Lösung mit dieser erstellten Tabelle, wie du Multiuser abbildest.
Haben die angelegten Tabellen namentlich immer einen Bezug zum Anwender?)

Viele Grüße,
Tommi
 
Zurück
Oben