時には、私の知らないうちに私のストアドプロシージャがドロップ/削除されたときを知る方法はありますか?MS SQL Serverでストアドプロシージャが削除されているかどうかを確認するにはどうすればよいですか?
私はデバッグして、ストアドプロシージャが終了していないことを知っていることがわかりました。これは数日前に作成してテストしました。
MS SQL Serverで削除されたストアドプロシージャを知る方法はありますか?
時には、私の知らないうちに私のストアドプロシージャがドロップ/削除されたときを知る方法はありますか?MS SQL Serverでストアドプロシージャが削除されているかどうかを確認するにはどうすればよいですか?
私はデバッグして、ストアドプロシージャが終了していないことを知っていることがわかりました。これは数日前に作成してテストしました。
MS SQL Serverで削除されたストアドプロシージャを知る方法はありますか?
プロシージャが存在するかどうかを確認するための標準的な方法は、
プロシージャが削除または作成されたときに電子メール通知を送信するには、[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'
迅速かつ汚い方法は何をするだろう:
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以降)を参照してください。
あなたは多かれ少なかれ、データベース・ベンダーに依存しないようにしたい場合は、INFORMATION_SCHEMAと呼ばれるSQL標準のカタログ・ビューを使用することができます - 彼らは、SQL Serverのは、MySQLおよび他の多くのシステムに実装している:
select * from INFORMATION_SCHEMA.ROUTINES
where ROUTINE_NAME = 'YourStoredProcName'
あなたの場合行を取り戻すと、格納されているprocはまだシステムに残っています。もしそうでなければ、それはなくなってしまいます。
マルク・
INFORMATION_SCHEMA :)で数秒で私を打つ+1 – Constantin
上記の答えは正しいですが、ベテランの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気の利いた、私はそれが好き:) –
+1好みに古い「sysobjectsに」オーバー「INFORMATION_SCHEMA.ROUTINES」 – Sung
それは「私のデータベースでmessinされています」素敵なビッグ・ブラザーとだ監査人。よくやった!! – granadaCoder