2013-11-25 3 views
1

데이터베이스를 쿼리 할 때마다 저장 프로 시저를 실행하는 방법이 있습니까? 나는 2012데이터베이스가 쿼리 될 때마다 저장 프로 시저를 실행하는 방법

나는 다음과 같이 뭔가를 할 수 있도록하려면 SQL 서버를 실행 해요 :

나는 테이블 표 1과 표 2를 포함 mydb 데이터베이스가 있습니다. Table1을 사용하지 않으므로 Table1에 대해 select 문을 실행할 때마다 (예 : SELECT * FROM Table1) Table1에 액세스했다는 메시지를 기록하는 특정 저장 프로 시저를 호출하기 위해 일부 코드가 여전히 액세스하고 있음을 알고 있습니다. 오래된 테이블에 가서 그 종속성을 제거 할 수 있습니다.

이것이 가능합니까?

+0

접근 방식은 {DBServer, Oracle, MySql 등}을 사용하는 DB 제품에 따라 다릅니다. 어느 쪽을 사용하고 있습니까? – tgolisch

+0

@tgolisch SqlServer 2012를 사용하고 있습니다. –

답변

3

내가 당신이 말하는 것과 비슷한 것을하고 싶을 때, 나는보기를 사용했습니다. (예 : 테이블 이름을 dbo.Table1에서 dbo.Table1_Orig로 변경하고 테이블 주위의 래퍼 인 dbo.Table1과 같은 뷰를 생성하고 SP 호출 또는 인라인 함수 또는 equiv 포함). 뷰는 테이블처럼 동작 할 수 있으며 사용자/앱에 투명하게 보일 수 있습니다.

그렇지 않은 경우 서버가 실제로 사용량이 많지 않은 경우 SQL 프로파일 러를 사용하여 특정 테이블에 대한 필터를 사용하여 쿼리를 기록하지 않을 수 있습니다. 서버에 약간의 오버 헤드가 추가되지만 (5 %) 그렇지 않으면 켜기/끄기가 쉽지 않습니다. 어떤 사람들은 Profiler를 매우 오랫동안 사용하지 않도록 조심하며 일부 회사는 프로덕션 DB에서 Profiler를 가리키는 것을 금지합니다. 시도해 보면 정말 조심해야합니다. 계속 주시하십시오. 아마 몇 달 동안은 그냥두기를 원하지 않을 것입니다. 그것은 악할 것이다.

+0

을 반영하도록 질문을 업데이트했습니다. Fergus는 여전히 내 대답을 입력하는 동안 자신의 대답을 게시했습니다. 보기에 대한 아이디어를 사용하면 그는 신용을 얻습니다. – tgolisch

2

그래서 대안으로, 당신이 원하는,하지만 매우 불쾌한 일을하는 한 가지 방법을 생각할 수 있습니다

을 내가 그러나 있으리라 믿고있어 표 2 효과적으로 표를 대체이라고?

이 경우 단순히 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) 뭔가 다른 표 이름 바꾸기를 Deprecated_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) 표 그쪽라는 뷰를 작성합니다

3) 또한 표에서 데이터를 반환하고 함수를 만들기 로그에 메시지를 기록 마에 따라서 위의 함수를 호출하고 액세스하는 레거시 코드는 메시지를 기록합니다

CREATE VIEW Table1 AS SELECT * FROM GetTable1() 

그것의 깊이 무서운,하지만이 단지 일시적인 조치입니다 생각하기 때문에 당신은 당신이했습니다 모든 코드를 찾을 때 놓친다면 아마도 도움이 될 것입니다 ...

관련 문제