我想创建一个审核程序,该程序将在我数据库中所有程序的catch块中调用。
我想在此审核DB中存储所有输入参数及其值的列表。
请建议我,如何在SQL Server中实现这一点
答案 0 :(得分:0)
我不知道以编程方式检索存储过程的参数列表及其值(可能涉及n个系统表和类似的东西)。如果没有达到这种复杂程度,如果有可能改变当前的程序,你可以在下面的行上做点什么。
ALTER
现有存储过程添加一个小功能,其中用VB填充表变量
设置字符串格式('@paramname = paramvalue'
)中的参数及其在当前proc中的值
然后,如果控件到达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;