Я не в курсе программно получения списка параметров и их значения хранимой процедуры (возможно, будет включать п число системных таблиц и тому подобные). Не вдаваясь в этот уровень сложности И, если изменить существующие процедуры, вы можете сделать что-то в строках ниже.
ALTER
существующие сохраненные проки добавить небольшую функциональность, где вы заполнить табличную переменную с
параметров в формате набора струн ('@paramname = paramvalue'
) и их значения в текущем прок , а затем огонь Ревизионную прок, если контроль достигает блока CATCH
.
--Add this code bit on top of the proc from where you want the Audit Proc to be fired
--Declare and insert into a table variable
Declare @ParamValues TABLE (params varchar(400))
insert into @ParamValues
select '@id = '+ @id UNION
select '@name = '+ @name UNION
select '@date = '+ @date
GO
...
....
END TRY
begin catch --Auditing proc code below
exec AuditDB.dbo.AuditProc @ParamValues,
OBJECT_NAME(@@PROCID) --this returns the name of current proc
end catch
-------
-------Create the requisite SQL objects
-------
CREATE TABLE AuditDB.dbo.AuditTable
(
AuditMessage varchar(400),
ProcName varchar(200),
DateTimeStamp DateTime
);
GO
CREATE TYPE AuditDB.dbo.ParamValuesType AS TABLE
(
params varchar(400)
);
GO
CREATE PROCEDURE AuditDB.dbo.AuditProc
@ParamValues dbo.ParamValuesType READONLY
,@ProcName varchar(200)
AS
BEGIN --Add whaterver lines of code required, this is just a basic version.
INSERT INTO AuditDB.dbo.AuditTable
SELECT params, @ProcName, cast(getdate() as datetime) FROM @ParamValues
END;
Означает, что вы хотите выполнить одну процедуру в блоке catch всех процедур? –
yes Krish Kvr, я ищу какую-то общую процедуру, которая будет вызываться из блока catch, и ввод процедуры может быть получен из некоторой системной процедуры –