2009-08-10 23 views
34

Sto cercando di analizzare il nostro DB di sviluppo in questo momento e di pulire alcuni dei vecchi procs/tabelle di test. È possibile determinare quale utente ha creato oggetti in un database di SQL Server 2005? Se sì, come potrei fare per trovare quelle informazioni?Determinare quale utente ha creato oggetti in SQL Server

Modifica: volevo solo chiarire che gli oggetti in questione esistono già. L'impostazione del controllo e dei trigger probabilmente non mi farebbe molto bene. Immagino che stavo cercando un modo per usare le tabelle/viste di sistema per ottenere le informazioni.

risposta

28

La risposta è "no, probabilmente non è possibile".

Mentre ci sono cose che potrebbero dire chi ha creato un determinato oggetto, ci sono molti "se" dietro di loro. Una recensione rapida (e non necessariamente completa):

sys.objects (e quindi sys.tables, sys.procedures, sys.views, ecc.) Ha la colonna principal_id. Questo valore è una chiave esterna che si riferisce all'elenco di utenti del database, che a sua volta può essere unito all'elenco degli accessi SQL (istanza). (Tutte queste informazioni sono disponibili in altre viste di sistema.)

Ma.

Un rapido controllo sul nostro setup qui e una rapida rassegna di BOL indica che questo valore è impostato (cioè non null) se è "diverso dal proprietario dello schema". Nel nostro sistema di sviluppo, e abbiamo dbo + altri due schemi, tutto si presenta come NULL. Questo è probabilmente perché tutti hanno i diritti dbo all'interno di questi database.

Questo sta utilizzando l'autenticazione NT. L'autenticazione SQL probabilmente funziona allo stesso modo. Inoltre, tutti hanno e usano un accesso univoco, o sono condivisi? Se il turnover dei dipendenti e gli accessi al dominio (o SQL) vengono interrotti, ancora una volta i dati potrebbero non essere presenti o potrebbero essere incompleti.

Puoi guardare questi dati sopra (seleziona * da sys.objects), ma se principal_id è nullo, probabilmente sei sfortunato.

+0

Buona risposta, copre tutte le basi ... – gbn

+0

Questo è praticamente quello che pensavo sarebbe stata la risposta. Grazie per l'aiuto. – bcasp

1

Se è necessario un meccanismo piccolo e specifico, è possibile cercare informazioni su DLL Triggers.

11

Se ogni utente ha il proprio accesso a SQL Server si potrebbe provare questo

select 
    so.name, su.name, so.crdate 
from 
    sysobjects so 
join 
    sysusers su on so.uid = su.uid 
order by 
    so.crdate 
+0

Ma sembra che so.uid sia davvero uno schema per dbs non importati: http://msdn.microsoft.com/en-us/library/ms177596.aspx – crokusek

0

Hai provato questa query:

SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, 
last_user_update,* 
FROM sys.dm_db_index_usage_stats 
WHERE database_id = DB_ID('<db name>') 
AND OBJECT_ID=OBJECT_ID('<table name>') 
30

Se l'oggetto è stato creato di recente, è possibile controllare le modifiche dello schema Report cronologia, all'interno di SQL Server Management Studio, che "fornisce una cronologia di tutte le esecuzioni di istruzioni DDL confermate nel database registrato dalla traccia predefinita":

enter image description here

È quindi possibile cercare le istruzioni create degli oggetti. Tra tutte le informazioni visualizzate, c'è il nome di accesso di chi ha eseguito l'istruzione DDL.

Problemi correlati