none
Welcher User hat eine Tabelle erstellt

    Allgemeine Diskussion

  • Hallo zusammen!

    Kann ich aus den Systemtabellen/-Sichten auslesen welcher user eine bestimmte Tabelle angelegt hat?

    Ich stoße in der Systemsicht "[sys].[all_objects]" auf die Spalte "[principal_id]", die jedoch immer NULL ist.

    Es geht in diesem konkreten Fall um temporäre Tabellen, deren Anzahl seit einiger Zeit extrem stark gewachsen ist.

     

    Danke schonmal für die Hilfe!

     

    Gruß

    Phil



    Mittwoch, 11. Januar 2012 07:12

Alle Antworten

  • Hallo Phillip
    die sys.sp_tables sollte Tabellenname und Owner zurückliefern. Vielleicht nützt Dir das mehr?
    Gruss
    Henry

    Hallo zusammen!

    Kann ich aus den Systemtabellen/-Sichten auslesen welcher user eine bestimmte Tabelle angelegt hat?

    Ich sto�?e in der Systemsicht "[sys].[all_objects]" auf die Spalte "[principal_id]", die jedoch immer NULL ist.

    Es geht in diesem konkreten Fall um temporäre Tabellen, deren Anzahl seit einiger Zeit extrem stark gewachsen ist.

     

    Danke schonmal für die Hilfe!

     

    Gru�?

    Phil



    Mittwoch, 11. Januar 2012 07:48
  • Hallo Henry,

     

    danke erstmal.

    Die SP sp_tables gibt mir zwar den "owner" zurück, was jedoch "nur" das Schema des Objektes ist.

    Ich müsste herausfinden welcher Benutzer diese Tabelle angelegt hat.

     

    Gruß

    Phil


    Mittwoch, 11. Januar 2012 08:37
  • Hi,

    für die Zukunft kannst du dir doch einen DDL Trigger schreiben, welcher dir den Benutzer in eine Logging Tabelle schreibt.

     

    Grüße


    Oliver

    Mittwoch, 11. Januar 2012 09:00
  • Hallo Phil
    Ich bin nicht ganz sicher, aber ich vermute, diese Information ist nicht abgelegt.
    Gruss
    Henry

    Hallo Henry,

     

    danke erstmal.

    Die SP sp_tables gibt mir zwar den "owner" zurück, was jedoch "nur" das Schema des Objektes ist.

    Ich müsste herausfinden welcher Benutzer diese Tabelle angelegt hat.

     

    Gru�?

    Phil


    Mittwoch, 11. Januar 2012 09:37
  • Ich müsste herausfinden welcher Benutzer diese Tabelle angelegt hat.

    declare @curr_tracefilename varchar(500)
    declare @base_tracefilename varchar(500)
    declare @indx int
    
    select @curr_tracefilename = path from sys.traces where is_default = 1
    set @curr_tracefilename = reverse(@curr_tracefilename)
    select @indx = PATINDEX('%\%', @curr_tracefilename)
    set @curr_tracefilename = reverse(@curr_tracefilename)
    set @base_tracefilename = LEFT( @curr_tracefilename,len(@curr_tracefilename) - @indx) + '\log.trc';
    
    select 
    	td.ObjectID,
    	o.type OjectType,
    	'['+td.DatabaseName+'].['+s.name+'].['+td.ObjectName+']' FullObjectName,
    	(case td.EventClass when 46 then 'create' when 47 then 'drop' when 164 then 'alter' end) EventClass,
    	td.StartTime,
    	td.LoginName,
    	td.NTUserName,
    	td.ApplicationName
    from
    	::fn_trace_gettable(@base_tracefilename,default) td	inner join sys.objects o
    	on td.ObjectID = o.[object_id] inner join sys.schemas s
    	on o.[schema_id] = s.[schema_id]
    where
    	EventClass in (46,47,164)
    	and EventSubclass = 0 
    	and DatabaseID = db_id()
    order by
    	td.ObjectID,
    	td.StartTime
    



    ExPEditor - free SQL Server database documentation tool
    Mittwoch, 11. Januar 2012 13:25
  • Du solltest vielleicht einmal Dein Berechtigungskonzept überdenken. Normalerweise sollte nur ein sehr limitierter User-Kreis in der Lage sein, permanente Tabellen in einer Datenbank anzulegen. :-)

    Was genau meinst Du mit "temporären Tabellen"?


    -- Frank Kalis Microsoft SQL Server MVP Webmaster: http://www.insidesql.org
    Mittwoch, 11. Januar 2012 15:53
  • Hallo Phil Ipp,

    wie Frank schon schreib solltest Du dein Berechtigungskonzept überarbeiten und etwas näher beschreiben, was Du mit temporären Tabellen meinst. Normalerweise werden temporäre Tabellen mit Beendigung der Sitzung automatisch gelöscht, so das Dein Problem eigentlich gar nicht auftreten sollte.


    Gruß Falk
    Blog Falk Krahl
    Freitag, 13. Januar 2012 22:40
  • Was genau meinst Du mit "temporären Tabellen"?

    Mit "temporären Tabellen" meine ich exakt das: temporäre Tabellen.

    Systemdatenbanken -> tempdb -> temporäre Tabellen

    #<tabellenname>

     

    Rechtekonzept überdenken? Ich wüsste nicht, dass ich jemals einem User explizit Rechte auf die tempdb gewährt habe oder das Recht temporäre Tabellen anzulegen.

    Ich wage jetzt einfach mal die Behauptung, dass das eine Standardeinstellung ist.


    Dienstag, 17. Januar 2012 06:48
  • Hallo Phil Ipp

    In diesem Fall solltest Du untersuchen, wieso die temporären Tabellen nicht gelöscht werden. Nach Beendigung einer Sitzung sollten diese automatisch aus der TempDB verschwinden. Könnte es sein, dass Deine Sitzungen nicht beendet werden? Oder hast Du allenfalls spezielle Konfigurationen in der TempDB vorgenommen?

    Fahre doch einmal den SQL Server herunter und starte diesen neu. Sind dann die temporären Tabellen immer noch da?

    Temporäre Tabellen werden nicht nur explizit angelegt, sondern auch implizit vom System, z.B. wenn Du eine Table Variable in einer SP verwendest, welche zu viel Speicher benutzt. In diesem Fall wird diese Variable als temporäre Tabelle in der TempDB angelegt, um den Speicher nicht zu überlasten. Aber auch diese temporären Tabellen sollten jeweils wieder verschwinden.

    Anhand des Namens der temporären Tabellen kannst Du evt. den Verursacher finden. Evt. ist es ein Fehler in einem Programm, der dies verursacht. Du kannst auch die explizit angelegten temprorären Tabellen per Code wieder Droppen, wenn es Dich stört, dass diese da sind, bis die Sitzung beendet wurde.

    Gruss

    Henry

    Dienstag, 17. Januar 2012 07:27
  • Hallo Henry,

    prinzipiell stören die temporären Tabellen nicht. Sie lassen die tempdb nur stark wachsen.

    Wenn der Server frisch gestartet ist, ist die Anzahl der temporären Tabellen sehr gering (ein- bis zweistelliger Bereich).

    Im laufenden Betrieb liegt die Anzahl jedoch im fünfstelligen Bereich. Ich befürchte, dass eine, der von uns eingesetzten Software, diese Masse verursacht. Um diese Anwendung ausfindig zu machen, wollte ich versuchen den "Ersteller" der temporären Tabellen herausfinden.

    Ein DDL-Trigger reagiert leider nicht auf temporäre Tabellen, also sehe ich momentan keine Möglichkeit herauszufinden woher diese stammen.

     

    Gruß

    Phil

    Dienstag, 17. Januar 2012 09:35
  • Du hast Recht. Für temp Tabellen braucht es keine speziellen Berechtigungen. Ich hatte mehr so etwas wie "permanente Staging Tabellen" im Hinterkopf. Allerdings gilt auch, was Henry gesagt hat, dass SQL Server sich automatisch um diese kümmert.  Um das zu tracken, könntest Du einen Trace aufsetzen und das Ereignis Object::Created mit einem Filter auf den Datenbanknamen "tempDB" mitschneiden. Bei einer 5-stelligen Anzahl an temp Tabellen wären vielleicht noch weitere Filter sinnvoll. :-)
    -- Frank Kalis Microsoft SQL Server MVP Webmaster: http://www.insidesql.org
    Dienstag, 17. Januar 2012 10:44
  • Hallo Frank,

    die Idee mit dem Trace werde ich weiter Verfolgen.

    Kannst Du mir dazu weitere Information geben für das "wie"?

    Danke!


    Dienstag, 17. Januar 2012 10:57
  • irgendwie hat MSDN ein Posting von mir verschluckt.

    Fragen:

    • Was macht / machen Deine Anwendung/en? Ist es allenfalls eine WebApp, die Connection Recycling macht?
    • Hast Du mal die Tabellennamen genauer angeschaut. Wenn sie von einer Variablen stammen, dann sollte gemäss meiner Erfahrung der Variablenname ganz hinten im Namen stehen. Wenn es zig-tausende sind, dann werden wohl nicht alle den gleichen Namen haben. Spätestens beim Anlegen der zweiten würde der Benutzer sonst einen Fehler bekommen.
    • Wenn es Variablen sind, dann hätte ich den Verdacht, dass hier etwas loopt, denn nur mit Benutzer-Interaktion werden wohl kaum 10-tausende von Tabellen von einzelnen Benutzern zusammen kommen.

    Gruss

    Henry

     

    Dienstag, 17. Januar 2012 11:00
  • Hallo Henry,

    - es laufen auf der Instanz sehr viele Applikationen

    - die Tabellennamen sind eher "kryptisch"

    bsp: dbo.#0000A135, dbo.#00016C8c, dbo.#0005653F, etc.

    Dienstag, 17. Januar 2012 12:34
  • Hallo Phil Ipp
     
    Lokale und Globale Temporäre Tabellen (# und ## Prefix) erhalten den Namen der Tabelle, wobei bei den lokalen dann noch viele _ und eine sequentielle Nummer folgen. Diese werden aber relativ schnell wieder gelöscht, spätestens wenn die Connetion geschlossen wird.
     
    Solche Namen wie Du sie siehst werden in der TempDB für Table Variablen verwendet (und vielleicht noch woanders). Wenn Du eine Funktion hast, die eine Tabelle zurückliefert, dann wird für das Resultset ebenfalls eine Tabelle mit einem solchen Namen in der TempDB abgelegt. Allerdings werden diese Tabellen reused, das heisst, es wird nicht für jeden Aufruf eine neue Temp-Table angelegt, sondern die bestehende weiter benutzt, es sei denn, Du benötigst mehrere Instanzen davon, z.B. in einem SQL mit einem Self-Join einer tablevalued Functions.
    Dieser Reuse scheint selbst über verschiedene UserIDs hinaus zu funktionieren, wenn die Tabelle vom anderen Benutzer nicht mehr benötigt wird und das selbst dann, wenn die Connection noch nicht beendet ist.
     
    Wenn Du zig-tausend davon hast, dann könnte es sein, dass irgendein SQL Statement einen Fehler drin haben oder Du hast wirklich irgendwo einen Loop drin, der nicht sauber beendet wird. Oder Du rufst so eine Funktion als SubSelect in einem Select Statement drin aus, das würde auch erklären, wieso es so viele sind.
     
    Diese temporären Tabellen, die aufgrund von Table Variablen angelegt wurden, bleiben auch erhalten, wenn ich die Connection von SSMS schliesse und sogar SSMS beende. Erst das Neustarten des Servers löscht diese Temporören Tabellen. Da diese allerdings re-used werden, sollten da keine zig-Tausend dieser temporären Tabellen angelegt werden, wenn es sich nicht um einen Programm Fehler handelt. Wieviel Platz solche "temporäre" Tabellen wirklich benötigen, weiss ich nicht. Es ist nicht möglich, den Inhalt dieser Objekte anzuschauen. Vielleicht ist es auch nur die Reservation des Namens und die Definition der Felder, nicht aber der Inhalt, der hier abgelegt wurde.
     
    Ein Trace wird wohl wirklich nötig sein, um rauszufinden, welches Programm loopt.
     
    Gruss
    Henry
     
     
     
     

    Hallo Henry,

    - es laufen auf der Instanz sehr viele Applikationen

    - die Tabellennamen sind eher "kryptisch"

    bsp: dbo.#0000A135, dbo.#00016C8c, dbo.#0005653F, etc.

    Mittwoch, 18. Januar 2012 04:24
  • Hallo Phil Gramzow,

    Ich möchte Dich bitten folgendes lesen und die Beiträge die Dir geholfen haben zu bewerten.

    Vielen Dank.

    Nutzen Sie die Bewertungsfunktionen ("Antwort" und "Hilfreich") in den MSDN Foren! Unter anderem können andere später eine Lösung schneller finden. Es ist also wünschenswert, dass die fragenden (Benutzer) die Postings/Beiträge anderer Beantworter bewerten.
    Hier dazu die wichtigsten Anhaltspunkte aus den Forenregeln und FAQs.


    Lösungsbeiträge als „Die Antwort“ markieren
    Bitte markieren Sie den Beitrag, der zur Lösung geführt hat, als "Die Antwort". Durch Bewerten eines Beitrags als "Die Antwort" können andere Teilnehmer die Lösung schneller finden. Außerdem können Sie dem Benutzer, der die Antwort eingereicht hat, für seinen Beitrag danken und zur Steigerung der Antwortqualität in der Diskussionsgruppe beitragen.
    [Quelle: Forenregeln]

    Wie bewerte ich einen Beitrag? Um einen Beitrag als hilfreich zu bewerten, klicken Sie in einem beliebigen Beitrag auf Als hilfreich bewerten. Sie können Ihre Stimme nur einmal für einen Beitrag abgeben.
    [Quelle: Häufig gestellte Fragen]

    Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Donnerstag, 2. Februar 2012 10:04
  • ****************************************************************************************************************
    Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
    ****************************************************************************************************************

    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 20. Februar 2012 14:59