2009-08-10 16 views
34

Estoy tratando de revisar nuestra base de datos de desarrollo en este momento y limpiar algunos de los procs/tablas de prueba anteriores. ¿Es posible determinar qué objetos creados por el usuario en una base de datos de SQL Server 2005? Si es así, ¿cómo encontraría esa información?Determine qué objetos creados por el usuario en SQL Server

Editar: Solo quería aclarar que los objetos en cuestión ya existen. Configurar la auditoría y los factores desencadenantes probablemente no me servirían de mucho. Creo que principalmente estaba buscando una forma de utilizar las tablas/vistas del sistema para acceder a la información.

Respuesta

28

La respuesta es "no, probablemente no puedas".

Si bien hay elementos que podrían decir quién creó un objeto dado, hay muchos "si" detrás de ellos. Una revisión rápida (y no necesariamente completa):

sys.objects (y por lo tanto sys.tables, sys.procedures, sys.views, etc.) tiene la columna principal_id. Este valor es una clave externa que se relaciona con la lista de usuarios de bases de datos, que a su vez se puede unir con la lista de inicios de sesión de SQL (instancia). (Toda esta información se puede encontrar en más vistas del sistema.)

Pero.

Una comprobación rápida de nuestra configuración aquí y una revisión superficial de BOL indica que este valor solo está establecido (es decir, no es nulo) si es "diferente del propietario del esquema". En nuestro sistema de desarrollo, y tenemos dbo + otros dos esquemas, todo aparece como NULL. Esto es probablemente porque todos tienen derechos dbo dentro de estas bases de datos.

Esto está utilizando la autenticación NT. La autenticación SQL probablemente funciona de manera muy similar. Además, ¿todos tienen y usan un inicio de sesión único, o se comparten? Si tiene una rotación de empleados y se eliminan los inicios de sesión de dominio (o SQL), una vez más los datos pueden no estar allí o pueden estar incompletos.

Puede revisar estos datos (seleccione * de sys.objects), pero si principal_id es nulo, probablemente no tenga suerte.

+0

Buena respuesta, cubre todas las bases ... – gbn

+0

Eso es más o menos lo que pensé que iba a ser la respuesta. Gracias por la ayuda. – bcasp

11

Si cada usuario tiene su propio SQL Server acceso Usted podría intentar esto

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

Pero parece que so.uid es realmente un SchemaId para dbs no importados: http://msdn.microsoft.com/en-us/library/ms177596.aspx – crokusek

0

¿Has probado esta consulta:

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

Si recientemente se creó el objeto, puede comprobar los cambios de esquema Informe histórico, dentro de SQL Server Management Studio, que "proporciona un historial de todas las ejecuciones de sentencias DDL confirmadas dentro de la base de datos registrada por la traza predeterminada":

enter image description here

Luego puede buscar las instrucciones de creación de los objetos. Entre toda la información que se muestra, está el nombre de usuario de quien ejecutó la declaración DDL.

Cuestiones relacionadas