问题描述
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
。