문제

내가 사용하는 ADO.NET 액세스 SQL Server2005 할 수 있 로그인 내부에서 T-SQL 저장 프로시저는 다음과 같습니다 나는 부름입니다.는 어떻게든 가능한가요?

나는 볼 수 없 출력에서'인쇄'-문을 사용하는 경우 ADO.NET 와 이후 사용하고 싶은 로깅을 위해 맞추기에 많은 유 이상적인 솔루션을 것을 방출하는 메시지를 명령 프롬프트를 엽서 SysInternals.

도움이 되었습니까?

해결책

내가 이것을 해결을 작성하여 SQLCLR 절차로 에릭 Z 수염을 제안합니다.조립 서명해야 합니다 강력한 이름으로 키를 파일에 저장할 수 있습니다.

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static int Debug(string s)
    {
        System.Diagnostics.Debug.WriteLine(s);
            return 0;
        }
    }
}

만든 키와 로그인:

USE [master]
CREATE ASYMMETRIC KEY DebugProcKey FROM EXECUTABLE FILE =
'C:\..\SqlServerProject1\bin\Debug\SqlServerProject1.dll'

CREATE LOGIN DebugProcLogin FROM ASYMMETRIC KEY DebugProcKey 

GRANT UNSAFE ASSEMBLY TO DebugProcLogin  

수입으로 SQL Server:

USE [mydb]
CREATE ASSEMBLY SqlServerProject1 FROM
'C:\..\SqlServerProject1\bin\Debug\SqlServerProject1.dll' 
WITH PERMISSION_SET = unsafe

CREATE FUNCTION dbo.Debug( @message as nvarchar(200) )
RETURNS int
AS EXTERNAL NAME SqlServerProject1.[StoredProcedures].Debug

다음할 수 있었을 로그에서 T-SQL 사용하여 절차

exec Debug @message = 'Hello World'

다른 팁

내가 생각하는 로그에 쓰기 테이블이 될 것으로 보입니다.

또는,당신을 사용하여,2005 년을 쓸 수 있는 간단한 SQLCLR 절차를 감싸는 이벤트.

사용할 수 있습니다 xp_logevent 는 경우에 당신을 쓰고 싶은 SQL 로그인

할 수 있거나 로그하는 테이블을 간단히 삽입하는 새로운 행,또는 당신을 구현할 수 있습니다 CLR 저장된 절차에 따라 파일에 쓰기.

주의 테이블에 쓰기 때문에,경우에는 동작을 트랜잭션에서 트랜잭션을 가져옵간압연,다시 귀하의 로그 항목이 사라질 것입니다.

로깅 내부에서 SQL sproc 것이 더 수행하는 데이터베이스에 자체입니다.T-SQL 쓸 수 있는 파일에 하지만 그것이 정말로 그것을 위해 설계되었습니다.

인쇄 명령하지만,내가 선호하는 로그인하도록 테이블을 쿼리할 수 있습니다.

를 작성할 수 있 행하는 로그에서 테이블에 저장되는 절차입니다.다른 사람으로 지정한 당신의 나갈 수 있었다 당신의 방법을 쓰기 텍스트 파일 또는 다른 로그 CLR 또는 xp_logevent 지만,그것은 당신처럼 보이는데 필요한 더 많은 양이 될 것입을 위해 실제 이러한 사용합니다.

힘든 경우가 발생(그리고 그것이 당신이 정말로 필요하신 로그)트랜잭션이 실패합니다.이후 어떤 기록하는 동안 발생하는 이러한 트랜잭션이 다시와 함께하는 트랜잭션의 일부,그것은 최고의를 로깅 API 는 클라이언트를 사용할 수 있습을 로그에 오류가 있습니다.이 될 수 있습니다 간단하 DAL 는 로그와 같은 데이터베이스,또는 공유 하나입니다.

이 가치가 무엇인지,아니라면 나는 할당하지 않는에서는 infomessage 처리기 내렇게 하려면 다음과 같:

sqlConnection.InfoMessage += new SqlInfoMessageEventHandler(MySqlConnectionInfoMessageHandler);

어디에의 서명 InfoMessageHandler 다음과 같습니다:

MySqlConnectionInfoMessageHandler(object sender, SqlInfoMessageEventArgs e)

다음은 내 인쇄 문서 저장된 발동에 나타나지 않습 DbgView.

당신이 사용할 수 있는 출력 변수를 전달하는 메시지,하지만 그에 의존하 proc 실행하지 않고 오류가 있습니다.

create procedure usp_LoggableProc 

@log varchar(max) OUTPUT 

as

-- T-SQL statement here ...

select @log = @log + 'X is foo'

고 그 다음에는 ADO 코드 somehwere:

string log = (string)SqlCommand.Parameters["@log"].Value;

당신이 사용할 수 있습 raiserror 자신을 만드는 사용자 지정에 오류가 정보를 필요로 하는 그 사용할 수 있을 통해 평소 SqlException 오류 컬렉션에서 당신의 ADO 코드:

RAISERROR('X is Foo', 10, 1)

흠이지만 그래,할 수 없습 데 도움이 느끼는지에 대한 디버깅 및 귀하의 상황에서,단지를 삽입하 varchar 메시지 오류 테이블에 다른 사람처럼 제안 및 선택*을 때 당신은 그것을 디버깅할 수 있습니다.

를 확인 할 수 있습니다 Log4TSQL.제공하는 데이터베이스 기록에 대한 저장된 절차 및 트리거에는 SQL Server2005-2008.있는 가능성을 설정하는 분리,독립적인 로그 레벨에서 당 절차/트리거 기준입니다.

--다음과 같은 DDL sql 을 만들 것입니다 당신은 테이블을 저장하는 로그 데이터 사용[db] 가

/****** Object:  Table [dbo].[tbData_Debug]    Script Date: 02/12/2009 22:30:03 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[tbData_Debug](
    [colTimeStamp] [timestamp] NULL,
    [colNiceTime] [varchar](200) NULL,
    [colDomain_User] [varchar](200) NULL,
    [colMsg] [varchar](4000) NULL,
    [colDebugLevel] [int] NULL,
    [colDebugMsg] [varchar](4000) NULL,
    [colPageName] [varchar](200) NULL,
    [colClassName] [varchar](200) NULL,
    [colMethodName] [varchar](200) NULL,
    [colMethodNameGui] [varchar](4000) NULL,
    [colRet] [int] NULL,
    [colLineNumber] [int] NULL,
    [colLineNumberGui] [int] NULL,
    [colProcedureName] [varchar](200) NULL,
    [colProcedureStep] [varchar](4000) NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO




-- This stored procedure does write to the log table

USE [db]
GO
/****** Object:  StoredProcedure [dbo].[procUtils_AppDebug]    Script Date: 02/12/2009 22:29:24 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[procUtils_AppDebug] (                  

@ret int = null OUT,     
@msgIn varchar(4000) = null ,   -- the msg which the user has seen   
@msgOut varchar(4000) = null OUT ,   -- the msg which the user has seen   
@domain_user varchar(200) = null ,                 -- the domain user echoing the message  
@debugMsgIn varchar(4000) = null  ,   -- the debug msg for internal use  
@debugMsgOut varchar(4000) = null  OUT,   -- the debug msg for internal use  
@pageName varchar(200) = null ,   -- the pageName originator of error  
@className varchar(200) = null ,   -- the class Name orinator of error  
@methodName varchar(200) = null ,   -- the methodName where the last error occured  
@methodNameGui varchar(4000) = null ,   -- the methodNameOfTheGui where the last error occured  
@lineNumber int = null ,  -- the line number of the line issueing the error  
@lineNumberGui int = null,   -- the line number of the line issueing the error               
@procedureName varchar(200) = null , -- the procedureName currently envoked
@procedureStep varchar(4000)  = null -- the steps of the procedure concatenated
)    

AS                  
BEGIN -- proc start                
 SET NOCOUNT ON;                

BEGIN TRY        --begin try      

declare @debugLevel int     
select @debugLevel =  Debug_Level from User_tb where Domain_Name = @domain_user  

/*                  
select * from tbData_Debug    order by 1 desc              
delete from tbData_Debug              
*/    


insert into tbData_Debug ( colNiceTime , colDomain_User , colMsg , colDebugLevel ,   
colDebugMsg , colPageName , colClassName , colMethodName , colMethodNameGui ,   
colRet , colLineNumber , colLineNumberGui , colProcedureName , colProcedureStep) values (
 dbo.funcGetNiceTime() , @domain_user  , @msgIn , @debugLevel ,@debugMsgIn , 
 @pageName , @className , @methodName  ,@MethodNameGui , @ret , 
 @lineNumber , @lineNumberGui , @procedureName , @procedureStep)     

set @debugMsgOut = @debugMsgIn  
set @msgOut = 'Action Registered'  
set @ret = @@ERROR     
return @ret                



END TRY        --end try      

BEGIN CATCH            
 PRINT 'In CATCH block.             
 Error number: ' + CAST(ERROR_NUMBER() AS varchar(10)) + '            
 Error message: ' + ERROR_MESSAGE() + '            
 Error severity: ' + CAST(ERROR_SEVERITY() AS varchar(10)) + '            
 Error state: ' + CAST(ERROR_STATE() AS varchar(10)) + '            
 XACT_STATE: ' + CAST(XACT_STATE() AS varchar(10));            

 set  @debugMsgOut = 'error at [procUtils_AppDebug]--- Error number: ' + CAST(ERROR_NUMBER() AS varchar(10)) + 'Error message: ' + ERROR_MESSAGE() + 'Error severity: ' +   
CAST(ERROR_SEVERITY() AS varchar(10)) + 'Error state: ' + CAST(ERROR_STATE() AS varchar(10)) + 'XACT_STATE: ' + CAST(XACT_STATE() AS varchar(10))            
set @msgIn= 'error while saving application error info into database'  
insert into tbData_Debug ( colMsg ) values ( @msgIn )     

set @debugMsgOut = @debugMsgIn +  @debugMsgOut  
set @msgOut = 'Action Registration failed'  
set @ret = 1           

END CATCH            


return  @ret                       
END --procedure end                 

/*       
<procedureDocumentation>      

<procedurename>procUtils_AppDebug<procedurename>      
<procedureDescription> Records events from the Application Layer </procedureDescription>    
<created>20090121</created>      
<createdby>Yordan Georgiev</createdby>      
<change>      

<changewhen><changewhen>      
<changeDescription></changeDescription>      
<changedBy></changedBy>      
</change>      


<testUsage>    

USE [db]    
GO    

DECLARE @return_value int,    
  @ret int,    
  @msgIn varchar(max),    
  @debugmsg varchar(4000)    

SELECT @ret = 1    
SELECT @msgIn = N'msg'    
SELECT @debugmsg = N'before'    

EXEC @return_value = [dbo].[procUtils_AppDebug]    
  @ret = @ret OUTPUT,    
  @msgIn = @msgIn OUTPUT,    
  @domain_user = N'domain_user',    
  @debugmsg = @debugmsg OUTPUT,    

  @methodName = N'methodName'    

SELECT @ret as N'@ret',    
  @msgIn as N'@msgIn',    
  @debugmsg as N'@debugmsg'    

SELECT 'Return Value' = @return_value    
select * from tbData_Debug order by 1 desc    
GO    

</testUsage>      
</procedureDocumentation>      
*/  
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top