在一个地方定义存储过程的通用功能?

问题描述

SQL Server是否有一种简单的方法来定义所有/某些存储过程之间的通用功能?

我想记录数据库中所有存储过程的执行详细信息(objectId,用户,开始,完成)。但是,1)我很懒,不想手动更新数十个存储过程,2)如果将来会创建存储过程,我想确保我们不会忘记将它们包括在日志中。我的服务器是SQL Server 2016,我无权访问服务器级设置,只能访问此数据库。

我的用例:

首先,我为插入日志记录的地方设置了一个表:

CREATE TABLE [dbo].[StoredProcedureExecutionLog](
    [Id] [int] IDENTITY(1,1) NOT NULL,[Executor] [nvarchar](128) NOT NULL,[ObjectId] [int] NOT NULL,[ProcedureName] [nvarchar](128) NOT NULL,[ExecutionStartTime] [datetime2](7) NOT NULL,[ExecutionFinishTime] [datetime2](7) NULL
)

然后,对于数据库中的每个存储过程,我想添加以下2条命令:

ALTER PROCEDURE [dbo].[myStoredProcedure]
AS
BEGIN
    -- I have to add this line to the beginning of every stored procedure
    INSERT INTO dbo.StoredProcedureExecutionLog(ObjectId,ProcedureName,ExecutionStartTime,Executor) VALUES (@@PROCID,OBJECT_NAME(@@PROCID),GETDATE(),SYSTEM_USER)

    -- ** Stored proc code goes here **

    -- I have to add this line to the end of every stored procedure
    UPDATE dbo.StoredProcedureExecutionLog SET ExecutionFinishTime = GETDATE() WHERE Id = SCOPE_IDENTITY()
END
RETURN 0;

对于我的特定用例,我想我甚至可以使用针对每个存储过程调用的某种前信号和后信号(如果这种事情甚至存在于SQL Server中)。

解决方法

我非常确定您不能更新SP基类,所以不,您不能这样做。

对于需要插入的第一行,您可以:SQL Management Studio右键单击db-> Tasks-> Generate Scripts->选择所有已存储的proc,将其归档。 然后编写一个打开该文件的小应用程序(任何编程语言),查找 ALTER PROCEDURE位置索引,然后是BEGIN的第一个实例,然后在其后插入您的行,然后寻找ALTER PROCEDURE的下一个位置和BEGIN的下一个第一个实例... 但是对于第二行,我想不出一种通过代码插入其中的可靠方法...

您最好将它咬住子弹,然后手动完成。

如果要这样做,可能最好是对所有sp的所有第一行进行处理,然后对所有sp的所有底行进行处理,这是因为这样做的效率会稍微提高(可能是33%)如果您以这种方式将其分开。

,

在此链接上查看接受的答案:

SQL-Server: Is there an equivalent of a trigger for general stored procedure execution

您也许可以对跟踪执行某些操作,从而使您可以捕获执行SP之前和之后所需的信息。

另外,看看如何使用sys.dm_exec_procedure_stats

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...