Sim, há um jeito
A tabela para armazenar os resultados do gatilho
USE [SOME_DATABASE]
GO
CREATE TABLE [dbo].[ddl_objects_log](
[date] [datetime] NULL DEFAULT (getdate()),
[login_name] [nvarchar](128) NULL,
[nt_user_name] [nvarchar](128) NULL,
[program_name] [nvarchar](128) NULL,
[host_name] [nvarchar](128) NULL,
[text] [xml] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
O gatilho
USE [SOME_DATABASE]
GO
/****** Object: DdlTrigger [ddl_db_trigger] Script Date: 22/01/2015 13:41:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [ddl_db_trigger]
ON DATABASE
FOR CREATE_FUNCTION,
CREATE_PROCEDURE,
CREATE_TABLE,
CREATE_TRIGGER,
CREATE_VIEW,
ALTER_FUNCTION,
ALTER_PROCEDURE,
ALTER_TABLE,
ALTER_TRIGGER,
ALTER_VIEW,
DROP_FUNCTION,
DROP_PROCEDURE,
DROP_TABLE,
DROP_TRIGGER,
DROP_VIEW,
CREATE_INDEX,
ALTER_INDEX,
DROP_INDEX
AS
BEGIN
set nocount ON
insert into ddl_objects_log(login_name, nt_user_name, program_name, host_name, text)
select login_name, nt_user_name, program_name, host_name, EVENTDATA() from sys.dm_exec_sessions WITH(NOLOCK) where session_id=@@SPID
set nocount OFF
END
GO
ENABLE TRIGGER [ddl_db_trigger] ON DATABASE
GO
A consulta para auditar os resultados do acionador
USE [SOME_DATABASE]
GO
SELECT top 10
REPLACE(CONVERT(VARCHAR(250), text.query('data(/EVENT_INSTANCE/PostTime)')),'T', ' ') as modify_datetime,
CONVERT(VARCHAR(215), text.query('data(/EVENT_INSTANCE/EventType)')) as event_type,
CONVERT(VARCHAR(225), text.query('data(/EVENT_INSTANCE/ServerName)')) as server_name,
CONVERT(VARCHAR(225), text.query('data(/EVENT_INSTANCE/DatabaseName)')) as database_name,
CONVERT(VARCHAR(225), text.query('data(/EVENT_INSTANCE/ObjectType)')) as object_type,
CONVERT(VARCHAR(225), text.query('data(/EVENT_INSTANCE/ObjectName)')) as object_name,
CONVERT(VARCHAR(215), text.query('data(/EVENT_INSTANCE/UserName)')) as user_name,
Login_name,
CONVERT(VARCHAR(MAX), text.query('data(/EVENT_INSTANCE/TSQLCommand/CommandText)')) as command_text
FROM [SOME_DATABASE].[dbo].[ddl_objects_log]
where CONVERT(VARCHAR(225), text.query('data(/EVENT_INSTANCE/ObjectName)')) like '%SOME_STORED_PROCEDURE%'
order by date desc
GO
Outro DBA pode ter uma opinião diferente, mas considero ter essas informações prontamente disponíveis como importantes para um DBA.
FROM [SOME_DATABASE].[dbo].[ddl_objects_log]
... Devo criar a tabela?Se você tiver o rastreamento padrão ativado e ele não tiver sido revertido, poderá usá-lo para descobrir quem criou o SP
Clique aqui para ampliar
Depende do motivo pelo qual você deseja saber se os objetos são criados / alterados ou descartados. Você pode usar a notificação de eventos para registrar e notificá-lo se sentir que objetos são criados / descartados ou alterados por um usuário não autorizado. Verifique se você possui filtros adequados no local.
Para completar esta resposta, quero mencionar - Quais informações do evento posso obter por padrão no SQL Server? de Aaron Bertrand.
fonte
DATEADD(HH, -24, GETDATE())
se deseja obter resultados por mais de 24 horas.select * from sys.procedures where type = 'P' order by create_date desc
AND DatabaseID= 'the_Database_I_Want
, não me mostra nada, mesmo com oDATEADD(HH, -24, GETDATE())
comentado. Estou fazendo algo errado?Estou chegando atrasado, mas "faço" coisas de segurança e administração.
SIM . É importante ter ou criar esses logs sempre que possível. No entanto, também é sua responsabilidade, na minha opinião, não "abrir esta caixa" até que ela se torne importante. Em outras palavras - novamente, na minha opinião - é seu trabalho fornecer o repositório de dados, garantir que eles sejam seguros, garantir que estejam sintonizados ... e depois ficar longe dos dados internos, a menos que você seja chamado especificamente olhe para ele ou a menos que seja necessário para atingir seu objetivo.
Minha opinião e minha visão, mas lidei com dados sensíveis e confidenciais por muitos anos e fiz questão de quase nunca [1] "abrir a caixa", pois isso degrada a confiança dos usuários.
Agora, deixe-me seguir um caminho diferente : e se ninguém puder descobrir rapidamente como o procedimento responde a casos extremos? O que você ou eu levaria uma hora para resolver pode levar alguns minutos para o autor: "ah, certo, isso falha quando ..."
fonte