如何在SQL Server 2008中找到上次修改日期,修改后的存储过程用户

时间:2010-12-09 04:37:51

标签: sql sql-server

我需要找到修改特定存储过程的人的用户名。

How do I find out when a stored procedure was last modified or compiled in Oracle?

让我了解时间。但是,我如何知道修改它的用户?

8 个答案:

答案 0 :(得分:13)

这对我有用: -

DECLARE @filename VARCHAR(255) 
SELECT @FileName = SUBSTRING(path, 0, LEN(path)-CHARINDEX('\', REVERSE(path))+1) + '\Log.trc'  
FROM sys.traces   
WHERE is_default = 1;  

SELECT gt.HostName, 
       gt.ApplicationName, 
       gt.NTUserName, 
       gt.NTDomainName, 
       gt.LoginName, 
       gt.SPID, 
       gt.EventClass, 
       te.Name AS EventName,
       gt.EventSubClass,      
       gt.TEXTData, 
       gt.StartTime, 
       gt.EndTime, 
       gt.ObjectName, 
       gt.DatabaseName, 
       gt.FileName, 
       gt.IsSystem
FROM [fn_trace_gettable](@filename, DEFAULT) gt 
JOIN sys.trace_events te ON gt.EventClass = te.trace_event_id 
WHERE EventClass in (164) --AND gt.EventSubClass = 2
ORDER BY StartTime DESC;

来源: - https://serverfault.com/questions/258111/finding-out-who-has-modified-a-stored-procedure-on-sql-server

答案 1 :(得分:10)

你可以尝试一下吗?

  

SELECT name,create_date,modify_date FROM sys.procedures

答案 2 :(得分:6)

在系统default trace中跟踪程序更改。只需打开.trc文件夹中的...\MSSQL\LOG文件,然后搜索ALTER PROCEDURE即可。唯一的问题是默认跟踪会及时重写,因此您只能将其用于最近的更改(天 - 周)。

答案 3 :(得分:1)

尝试架构更改历史记录报告。

在SQl服务器管理Sudio中 - >右键单击服务器名称或模式名称 - >报告 - >标准报告 - >架构更改历史记录

这对我来说就像一个魅力。

取自here

答案 4 :(得分:0)

你不能seems

答案 5 :(得分:0)

如果您将来需要此信息,可能值得考虑在CREATE_PROCEDURE和ALTER_PROCEDURE DDL trigger上实施DDL events

来自EVENTDATA页面的示例B显示了一个触发器,记录了所有DDL事件,并捕获了用户名。

答案 6 :(得分:0)

我尝试了以下查询,它对我有用:

SELECT *
FROM sys.objects
WHERE type = 'P'
ORDER BY modify_date DESC

此查询用于存储过程。

答案 7 :(得分:-8)

这可以通过运行以下任何查询来实现。

SELECT 
    [procedure] = QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))
        + '.' + QUOTENAME(OBJECT_NAME([object_id])),
    last_execution_time,
    avg_execution_time = CONVERT(DECIMAL(30,2), total_worker_time * 1.0 / execution_count),
    max_worker_time
FROM sys.dm_exec_procedure_stats
WHERE database_id = DB_ID()
ORDER BY avg_execution_time DESC;

------------ OR ---------------------------------- ----

SELECT 

COALESCE(DB_NAME(t.[dbid]),'Unknown') AS [DB Name],
ecp.objtype AS [Object Type],
t.[text] AS [Adhoc Batch or Object Call],
SUBSTRING(t.[text], (qs.[statement_start_offset]/2) + 1,
((CASE qs.[statement_end_offset]
WHEN -1 THEN DATALENGTH(t.[text]) ELSE qs.[statement_end_offset] END
- qs.[statement_start_offset])/2) + 1) AS [Executed Statement]
,qs.[last_execution_time] AS [Last Exec Time]
,qs.[creation_time] AS [Creation Time]

FROM sys.dm_exec_query_stats AS qs
    JOIN sys.dm_exec_cached_plans ecp 
            ON qs.plan_handle = ecp.plan_handle
            CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS t
where
    ecp.objtype = 'Proc'

order by [Last Exec Time]  desc