select top 1 *

derhenry

Fleissiger Benutzer
Beiträge
54
Moin zusammen,

ein Office-Adin muss beim Start überprüfen, ob der Anwender Zugriff auf eine bestimmte Datenbank-Tabelle hat. Dafür wird aktuell
select top 1 * from
abgesetzt. Da die Tabelle recht groß ist, dauert die Antwort recht lange, läuft manchmal in den 30-Sekunden-Timeout und bremst den Anwender aus. Leider wird offenbar trotzdem die ganze Tabelle abgefragt, auch wenn nur ein Wert zu Testzecken zurück kommen soll.

Habt Ihr eine Idee, wie ich den Zugriff anders testen und mein Query ändern kann?
Danke!
derhenry
 
Werbung:
Soweit ich weiß kann jeder User in der View "sys.database_permissions" seine eigenen Zugriffsrechte sehen... Warum nicht einfach prüfen ob die Tabelle darin enthalten ist?
 
Passiert das auch, wenn du per WHERE die Datensätze z.B. auf einen PK einschränkst?

Man könnte auch eine Sicht mit TOP 1 anlegen und diese dann Abfragen. Eventuell greifen die Berechtigungen dann entsprechend, es kommen aber nicht immer alle Daten.

Wir hatten den Fall hier glaube ich auch schon, das scheint wirklich eine Office-Marotte zu sein.
 
Das einschränken auf einen PK bringt es auch nicht. Wo finde ich denn die sys.database_permissions? Ist die Dynamisch für den jeweilst darauf zugreiden Nutzer?
 
Hab jetzt mal in diese sys.database_permissions geschaut. Wüsste jetzt nicht, wie die mir weiterhelfen kann.
Eine Anpassung des Querys zu "egal welcher Datensatz, gib mir nur irgendetwas und zwar schnell" geht nicht, was? ;)
 
"egal welcher Datensatz, gib mir nur irgendetwas und zwar schnell"
Genau das macht SELECT TOP 1 * nur deine Office Anwendung setzt es offenbar falsch um. Jetzt gäbe es noch andere Möglichkeiten einzugrenzen (z.B. mit WHERE), das kann man aber auch nur durchprobieren. Welche Office Anwendung ist es denn überhaupt? Was genau tut das Addin?
 
Es handelt sich um einen View. Kein Primärschlüssel da. SQL Management Studio habe ich nicht.
Schränke ich auf einen speziellen Wert ein, wird es auch nicht merklich schneller.
 
Ahhhh. Ein VIEW. Da wird natürlich erst mal das Select materialisiert. Vielleicht solltest Du schlicht die Basistabellen prüfen und nicht den View?
 
Select Null From view Where 1 = 0
Ist natürlich cool. Und sauschnell. ;)
Wenn der Anwender da keine Rechte drauf hat, wird das ja wohl auch nicht funktionieren, was? Da ich ja Zugriff habe, kann ich das nicht gut testen. ;)
 
Werbung:
Zurück
Oben