每次查询数据库时如何执行存储过程

时间:2013-11-25 20:38:56

标签: sql sql-server stored-procedures instrumentation

每次查询数据库时是否有办法执行存储过程?我正在运行SQL Server 2012

我希望能够执行以下操作:

我有包含表Table1和Table2的数据库MyDB。 我已经弃用了Table1,现在每次有人对Table1运行任何select语句(例如SELECT * FROM Table1)我想调用某个存储过程来记录一条消息,说明Table1被访问了,所以我知道一些代码是仍在访问旧表,可以删除该依赖项。

这可能吗?

2 个答案:

答案 0 :(得分:3)

当我想做与你所说的相似的事情时,我使用了一个视图。 (例如,将表从dbo.Table1重命名为dbo.Table1_Orig并创建一个类似dbo.Table1的视图,它是表的包装器,包括SP调用或内联函数或等效项)。视图可以像表一样,并且通常对用户/应用程序来说是透明的。

否则,如果您的服务器不是很忙,您可能需要考虑使用SQL分析器,并为该特定表使用过滤器,因此它不会记录查询的数据。它会在服务器上增加一些开销(5%),但除此之外,它非常不引人注目且易于打开/关闭。有些人非常担心长时间离开Profiler,有些公司禁止将Profiler指向生产数据库。如果你尝试的话要非常小心。留意它。你可能不想让它运行几个月。那将是邪恶的。

答案 1 :(得分:2)

我可以想到一种方法来做你想做的事情,但它非常讨厌,所以作为另类:

我假设Table2实际上是Table1的替代品?

在这种情况下,是否可以简单地删除Table1并将其替换为将Table2转换为原始Table1形状的同名视图?

这样,您就不需要记录消息,因为您遗漏的任何代码都会凭借视图有效地访问正确的表格...

如果这对你没有好处,那么这是我非常讨厌的答案。它依赖于你启用xp_cmdshell,并将其用作黑客来绕过不允许副作用的函数:

1)启用xp_cmdshell:

EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO

2)将Table1重命名为其他名称,例如Deprecated_Table1

3)创建一个从Table1返回数据的函数,并将消息记录到日志中:

CREATE FUNCTION GetTable1()
RETURNS @Table1 TABLE
(
    ID int
)
AS
BEGIN
    DECLARE @sql varchar(3000)
    DECLARE @cmd varchar(4000)

    SELECT @sql = 'INSERT INTO MyLog Values(''Oops a daisy'')'
    SELECT @cmd = 'sqlcmd -S ' + @@servername + ' -d ' + db_name() + ' -Q "' + @sql + '"'

    EXEC master..xp_cmdshell @cmd, 'no_output'

    INSERT INTO @Table1
    SELECT ID FROM Deprecated_Table1

    RETURN
END

4)创建一个名为Table1的视图,您的遗留代码将访问该视图,调用上述函数,从而记录一条消息:

CREATE VIEW Table1 AS SELECT * FROM GetTable1()

它非常可怕,但是我想这只是一个临时措施,而你找到了你错过的所有代码,也许它会帮助你......