每次查询数据库时是否有办法执行存储过程?我正在运行SQL Server 2012
我希望能够执行以下操作:
我有包含表Table1和Table2的数据库MyDB。
我已经弃用了Table1,现在每次有人对Table1运行任何select语句(例如SELECT * FROM Table1
)我想调用某个存储过程来记录一条消息,说明Table1被访问了,所以我知道一些代码是仍在访问旧表,可以删除该依赖项。
这可能吗?
答案 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()
它非常可怕,但是我想这只是一个临时措施,而你找到了你错过的所有代码,也许它会帮助你......