有时会发生这种情况,如何在我不知情的情况下删除/删除存储过程?
每当我调试并发现知道存储过程没有退出时,它就会让我感到烦恼,这是几天前创建和测试的。
有没有办法知道MS SQL Server中删除的存储过程?
答案 0 :(得分:7)
检查程序是否存在的标准方法是
if exists(
SELECT * FROM INFORMATION_SCHEMA.ROUTINES
WHERE routine_type = N'PROCEDURE' and routine_name = @procname)
print 'exists'
从MSSQL 2005开始,您可以使用[DDL trigger](http://msdn.microsoft.com/en-us/library/ms190989(SQL.90%29.aspx)在删除或创建过程时发送电子邮件通知:
USE msdb
GO
CREATE TABLE ddl_log
(ID int idenity(1,1) PRIMARY KEY CLUSTERED,
PostTime datetime,
DB_User nvarchar(100),
Event nvarchar(100),
TSQL nvarchar(2000));
CREATE TRIGGER DDL_Notify
ON DATABASE
FOR DROP_PROCEDURE, CREATE_PROCEDURE
AS
DECLARE @data XML,
@tableHTML NVARCHAR(MAX) ;
SET @data = EVENTDATA()
INSERT msdb.dbo.ddl_log (PostTime, DB_User, Event, TSQL)
VALUES (GETDATE(), CONVERT(nvarchar(100), USER_NAME()),
@data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)') ) ;
SET @tableHTML =
N'<H1>DDL Table Event</H1>' +
N'<table border="1">' +
N'<tr><th>Post Time</th><th>User</th>' +
N'<th>TSQL</th><th></tr>' +
CAST ( ( SELECT td = PostTime, '',
td = DB_User, '',
td = TSQL, ''
FROM msdb.dbo.ddl_log
WHERE id = (select max(id) from msdb.dbo.ddl_log)
FOR XML PATH('tr'), TYPE
) AS NVARCHAR(MAX) ) +
N'</table>';
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Default',
@recipients = 'dba@youraddress.com',
@subject = 'DDL Table Event',
@body = @tableHTML,
@body_format = 'HTML'
答案 1 :(得分:3)
如果您想要或多或少地独立于数据库供应商,您可以使用名为INFORMATION_SCHEMA的SQL标准目录视图 - 它们在SQL Server,MySQL和许多其他系统中实现:
select * from INFORMATION_SCHEMA.ROUTINES
where ROUTINE_NAME = 'YourStoredProcName'
如果你回来一行,那么存储的proc仍然在系统中 - 如果没有,它就会消失。
马克
答案 2 :(得分:2)
if not exists(select * from sysobjects where type='P' and name= @procedure_name)
print 'does not exist'
答案 3 :(得分:1)
以上答案是正确的,但我不明白为什么经验丰富的dba不包含架构名称。 下面显示了SCHEMA和区分大小写的更正。
IF NOT EXISTS
(
SELECT * FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = N'PROCEDURE' and ROUTINE_SCHEMA = N'dbo' and ROUTINE_NAME = N'uspMyProcedure'
)
BEGIN
print 'Does not exist'
END
...
Microsoft.com上的模式讨论
http://msdn.microsoft.com/en-us/library/dd283095%28v=sql.100%29.aspx
...
就“如果存在”的最佳实践而言......我还将通过TSQL审阅Andy Leonard的5部分系列(并且还在增长)。
答案 4 :(得分:0)
快速而肮脏的方式是:
sp_helptext proc_name
如果函数抱怨,则缺少存储过程。
如果要以编程方式查找,请在sysobjects表上执行查询。
答案 5 :(得分:0)
如果您真的想知道“何时”删除了您的程序,请查找DDL triggers(SQL 2005及更高版本)。