Мне нужно найти имя пользователя, который изменил определенную хранимую процедуру.
дает мне представление о времени. Но как узнать пользователя, который его изменил?
Мне нужно найти имя пользователя, который изменил определенную хранимую процедуру.
дает мне представление о времени. Но как узнать пользователя, который его изменил?
Этого можно достичь, выполнив любой из следующих запросов.
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;
------------ ИЛИ ---------------------------------- ----
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
Вы можете попробовать это?
SELECT name, create_date, modify_date FROM sys.procedures
Здесь он работает для меня: -
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
Изменения процедуры отслеживаются в системе трассировка по умолчанию. Просто откройте файл .trc
из вашей папки ...\MSSQL\LOG
и выполните поиск инструкции ALTER PROCEDURE. Единственная проблема заключается в том, что трассировка по умолчанию получает перезапись во времени, поэтому вы можете использовать ее только для последних изменений (дни-недели).
Это кажется, вы не можете.
Считать историю изменений изменений схемы.
В SQl Server Management Sudio → Щелкните правой кнопкой мыши имя сервера или имя схемы → Отчеты → Стандартные отчеты → История изменений схемы
Это работало для меня как шарм.
Взято из здесь
Если вам понадобится эта информация в будущем, может быть стоит рассмотреть возможность создания DDL-триггера в CREATE_PROCEDURE и ALTER_PROCEDURE события DDL
Пример B на странице EVENTDATA показывает триггер, регистрирующий все события DDL с захваченным именем пользователя.
Вы можете посмотреть трассировку по умолчанию и легко понять это.
Это показано в качестве примера, и вам нужно посмотреть столбец Object: Altered of EVENT NAME.
Выполните следующий SQL script,
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;