有時候會發生這種情況,我怎麼知道我的存儲過程何時在我不知情的情況下丟失/刪除?如何知道我的存儲過程是否在MS SQL Server中被刪除?
無論何時我調試並發現存儲過程不存在,它在幾天前創建和測試,它惹惱我。
有沒有辦法知道MS SQL Server中刪除的存儲過程?
有時候會發生這種情況,我怎麼知道我的存儲過程何時在我不知情的情況下丟失/刪除?如何知道我的存儲過程是否在MS SQL Server中被刪除?
無論何時我調試並發現存儲過程不存在,它在幾天前創建和測試,它惹惱我。
有沒有辦法知道MS SQL Server中刪除的存儲過程?
檢查過程中存在的標準方法是
if exists(
SELECT * FROM INFORMATION_SCHEMA.ROUTINES
WHERE routine_type = N'PROCEDURE' and routine_name = @procname)
print 'exists'
與MSSQL 2005開始,您可以使用[DDL觸發器(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 = '[email protected]',
@subject = 'DDL Table Event',
@body = @tableHTML,
@body_format = 'HTML'
快速和骯髒的方法是做到:
sp_helptext的proc_name中
如果函數抱怨,然後存儲過程丟失。
如果您想以編程方式查找,請在sysobjects表上執行查詢。
if not exists(select * from sysobjects where type='P' and name= @procedure_name)
print 'does not exist'
如果您確實想知道「何時」刪除了您的程序,請查找DDL triggers(SQL 2005及更高版本)。
如果你想或多或少數據庫廠商無關,你可以使用SQL標準目錄視圖名爲INFORMATION_SCHEMA - 他們在SQL Server,MySQL和許多其他的系統來實現:
select * from INFORMATION_SCHEMA.ROUTINES
where ROUTINE_NAME = 'YourStoredProcName'
如果您取回一行,存儲的proc仍然在系統中 - 如果沒有,它就不存在了。
馬克
以上的答案是正確的,但我從來不明白爲什麼經驗豐富的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部分系列(以及不斷髮展)的測試驅動開發。
+1漂亮,我喜歡它:) – 2009-04-13 12:34:05
+1偏好「INFORMATION_SCHEMA.ROUTINES」在舊的「系統對象」 – Sung 2009-04-14 03:38:27