을 얻는 방법 절차에 텍스트 전에 변경에서 DDL 트리거
-
19-09-2019 - |
문제
내가 만드는 트리거를 추적하는 방법 절차를 텍스트 ALTER
ed.
내부 데이터베이스 DDL 트리거
그것은 접속이 가능한 현재 절차의 텍스트를 통해 /EVENT_INSTANCE/TSQLCommand
.
후에도 조사 EVENTDATA()
, 지 않았다,그 값을 포함한 이전의 정의 절차기 전에 ALTER
.
가를 검색할 수 있는 방법을 이전처럼 텍스트는 어떻게 그것이 가능한 액세스하는 삭제되는 값에서 DML 를 사용하여 트리거 DELETED
테이블?
create trigger trgDDLAuditQuery
on database
for alter_procedure
as
begin
set nocount on;
declare @data xml
set @data = EVENTDATA()
insert dbo.tblQueryAudit(ObjectName, TSQLCommand)
select @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(256)'),
--; Only gets currently changed procedure text, not previous one
@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)')
end
GO
해결책
트리거가 실행한 후에는 변경되었다,그래서 지금까지 내가 말할 수 없음에 액세스하기 전에""값입니다.EVENTDATA()정의된다고 규정되어 있지 아니한"이".결과적으로,당신은 단지 현재 값을 기록에서 로그를 보실 수 있습니다.그러나는 경우를 미리 채우도록 명령
INSERT INTO dbo.tblQueryAudit
(ObjectName, TSQLCommand)
SELECT
o.Name,m.definition
FROM sys.objects o
INNER JOIN sys.sql_modules m ON o.object_id=m.object_id
WHERE type='P'
당신이 사용할 수 있습 트리거 아직 완전한 그림을 그의 모든 변경합니다.귀하의 로그에 있는 모든 이전 버전뿐만 아니라 현재 버전은 각각의 절차입니다.사용할 수 있습니 내 버전의 트리거(아래 참조)에,당신은에 액세스 할 수 있습니다 다른 열을 sys.체 및 sys.sql_modules,다음과 같:
uses_ansi_nulls
uses_quoted_identifier
is_schema_bound
null_on_null_input
principal_id
될 수 있는 편리한 로그 뿐입니다.다른 버전:
CREATE trigger trgDDLAuditQuery
on database
for alter_procedure
as
begin
set nocount on;
DECLARE @EventData xml
SET @EventData=EVENTDATA()
INSERT INTO dbo.tblQueryAudit
(ObjectName, TSQLCommand) --hope you have datetime column that defaults to GETDATE()
SELECT
o.Name,m.definition
FROM sys.objects o
INNER JOIN sys.sql_modules m ON o.object_id=m.object_id
WHERE o.Name=@EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(max)')
--modify as necessary AND type='P'
end
GO
제휴하지 않습니다 StackOverflow