2009-04-13 5 views
4

時には、私の知らないうちに私のストアドプロシージャがドロップ/削除されたときを知る方法はありますか?MS SQL Serverでストアドプロシージャが削除されているかどうかを確認するにはどうすればよいですか?

私はデバッグして、ストアドプロシージャが終了していないことを知っていることがわかりました。これは数日前に作成してテストしました。

MS SQL Serverで削除されたストアドプロシージャを知る方法はありますか?

答えて

7

プロシージャが存在するかどうかを確認するための標準的な方法は、

プロシージャが削除または作成されたときに電子メール通知を送信するには、[DDLトリガー]( http://msdn.microsoft.com/en-us/library/ms190989(SQL.90%29.aspx)を使用することができますMSSQL 2005から
if exists(
    SELECT * FROM INFORMATION_SCHEMA.ROUTINES 
    WHERE routine_type = N'PROCEDURE' and routine_name = @procname) 
    print 'exists' 

です:

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' 
+0

+1気の利いた、私はそれが好き:) –

+0

+1好みに古い「sysobjectsに」オーバー「INFORMATION_SCHEMA.ROUTINES」 – Sung

+0

それは「私のデータベースでmessinされています」素敵なビッグ・ブラザーとだ監査人。よくやった!! – granadaCoder

0

迅速かつ汚い方法は何をするだろう:

sp_helptextをproc_nameに

機能は、ストアドプロシージャが欠落しているその後、文句を言う場合。

プログラムで検索する場合は、sysobjectsテーブルでクエリを実行します。

2
if not exists(select * from sysobjects where type='P' and name= @procedure_name) 
    print 'does not exist' 
0

プロシージャが削除される時期を実際に知りたい場合は、DDL triggers(SQL 2005以降)を参照してください。

3

あなたは多かれ少なかれ、データベース・ベンダーに依存しないようにしたい場合は、INFORMATION_SCHEMAと呼ばれるSQL標準のカタログ・ビューを使用することができます - 彼らは、SQL Serverのは、MySQLおよび他の多くのシステムに実装している:

select * from INFORMATION_SCHEMA.ROUTINES 
where ROUTINE_NAME = 'YourStoredProcName' 

あなたの場合行を取り戻すと、格納されているprocはまだシステムに残っています。もしそうでなければ、それはなくなってしまいます。

マルク・

+0

INFORMATION_SCHEMA :)で数秒で私を打つ+1 – Constantin

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つのパートシリーズ(および成長する)をご覧ください。

http://www.sqlservercentral.com/articles/Testing/66553/

関連する問題