含蓄事务和错误管理的蕴藏进度

2019-11-21 20:20 来源:未知

2.创建写入错误日志的存储过程

CREATE PROCEDURE [dbo].[Error_LogError]
    @ErrorLogID [int] = 0 OUTPUT -- [t_ErrorLog]ID
AS                               
BEGIN
    SET NOCOUNT ON;
    -- //错误信息ID
    SET @ErrorLogID = 0;
    BEGIN TRY
        -- //判断有没有错误信息
        IF ERROR_NUMBER() IS NULL
            RETURN;
        -- //Return if inside an uncommittable transaction.
        -- //Data insertion/modification is not allowed when 
        -- //a transaction is in an uncommittable state.
        IF XACT_STATE() = -1
        BEGIN
            PRINT '因为当前事务处于不可提交状态所以不能记录错误信息。 ' 
                  '为了能够成功记录错误信息,需要在执行Error_LogError前回滚事务。';
            RETURN;
        END
        INSERT [dbo].[t_ErrorLog] 
            (
            [UserName], 
            [ErrorNumber], 
            [ErrorSeverity], 
            [ErrorState], 
            [ErrorProcedure], 
            [ErrorLine], 
            [ErrorMessage]
            ) 
        VALUES 
            (
            CONVERT(sysname, CURRENT_USER), 
            ERROR_NUMBER(),
            ERROR_SEVERITY(),
            ERROR_STATE(),
            ERROR_PROCEDURE(),
            ERROR_LINE(),
            ERROR_MESSAGE()
            );
        SET @ErrorLogID = @@IDENTITY;
    END TRY
    BEGIN CATCH
        EXECUTE Error_PrintError;--//打印错误信息的存储过程
        RETURN -1;
    END CATCH
END

创建存储过程的语句如下

4.创建自己的存储过程

CREATE PROCEDURE PROCEDURE_NAME
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY--//开始捕捉异常
    BEGIN TRAN--//开始事务
    --//你的方法
    COMMIT TRAN --//提交事务
END TRY--//结束捕捉异常
BEGIN CATCH--//有异常被捕获
    IF @@TRANCOUNT > 0--//判断有没有事务
    BEGIN
        ROLLBACK TRAN--//回滚事务
    END 
    DECLARE @ErrorLogID INT ;
    EXEC Error_LogError @ErrorLogID OUTPUT;--//执行存储过程将错误信息记录在表当中
END CATCH--//结束异常处理
END

From Customers WHERE CustomerID=$CustomerID

以前在开发中需要用到带错误处理的存储过程,在网上找到了解决方案,现在整理在这,以备日后所需,时间长了原文已经找不到了,感谢为我提供帮助的兄弟。

@msgnum = 50512,

1.创建错误日志表

CREATE TABLE [dbo].[t_ErrorLog](
    [ErrorLogID] [int] IDENTITY(1,1) NOT NULL,
    [ErrorTime] [datetime] NOT NULL,
    [UserName] [sysname] NOT NULL,
    [ErrorNumber] [int] NOT NULL,
    [ErrorSeverity] [int] NULL,
    [ErrorState] [int] NULL,
    [ErrorProcedure] [nvarchar](126) NULL,
    [ErrorLine] [int] NULL,
    [ErrorMessage] [nvarchar](4000) NOT NULL,
 CONSTRAINT [PK_ErrorLog_ErrorLogID] PRIMARY KEY CLUSTERED 
(
    [ErrorLogID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[t_ErrorLog] ADD  CONSTRAINT [DF_ErrorLog_ErrorTime]  DEFAULT (getdate()) FOR [ErrorTime]
GO

创建语句:

3.创建打印错误信息的存储过程

CREATE PROCEDURE [dbo].[Error_PrintError]
AS
BEGIN
    SET NOCOUNT ON;
    -- Print error information. 
    PRINT 'Error '   CONVERT(varchar(50), ERROR_NUMBER())  
          ', Severity '   CONVERT(varchar(5), ERROR_SEVERITY())  
          ', State '   CONVERT(varchar(5), ERROR_STATE())   
          ', Procedure '   ISNULL(ERROR_PROCEDURE(), '-')   
          ', Line '   CONVERT(varchar(5), ERROR_LINE());
    PRINT ERROR_MESSAGE();
END

答: AE

  1. 首先自定义一个错误号为50512的用户自定义错误,错误的严重级别为10,错误的文本消息为’Can’t find the customer ID. ’,另外消息中还要加上表名和输入的CustomerID,  并且当发生消息时将消息写入 Microsoft® Windows NT® 应用程序日志中。然后创建一个名为ExistCustomerID的存储过程,以用它来找出SQL SERVER中的northwind数据库的Customer表中,指定的CustomerID是否存在,如果存在返回0,如果不存在返回错误号50512,并将消息写入 Microsoft® Windows NT® 应用程序日志中。写出定义错误消息和创建存储过程的语句。

6.      在数据库中必须修改一个存储过程,而有几个用户已被授予了执行该存储过程的权限。执行哪个语句来完成修改而又不影响现有的权限?

     RETURN

 

  END

LIKE

E   查询syscomments系统表

 

 

CREATE PROCEDURE dbo. FindCustomer

  1. 你在northwind数据库中创建了一个名为overdueOrders的储存过程,而且没被加密。那么以下哪些方法可以查看存储过程的内容。(不定项选择)

From Customers WHERE CustomerID=@CustomerID

 

@severity = 10,

 

GO

答: B

@CustomerID char(5)

IF LEN(@CustomerID)=0

CREATE PROCEDURE dbo. FindCustomer

USE northwind

  

RETURN 0

EXEC northwind.dbo. FindCustomer

SELECT contactName

SELECT contactName

From Customers WHERE CustomerID=@CustomerID 

    PRINT 'You must supply a valid CustomerID'

 

EXEC northwind.dbo. FindCustomer

 

$CustomerID= ‘thecr’

     

@LineNum int OUTPUT,

 

答: 定义自定义错误消息

  1. 创建一个名为FindCustomer存储过程,可以用它来找出SQL SERVER中的northwind数据库的Customer表中,CustomerID为指定值(输入参数)的记录的ContactName字段的名称,然后调用这个存储过程,找出CustomerID为’thecr’的ContactName字段值,写出创建存储过程的SQL语句和调用的命令,以下选项哪一个是正确的。

   RETURN  0

END

  D

 

答: ALTER PROC。如果执行DROP PROC和CREATE PROC语句来实现想要的修改,必须再次授予用户EXECUTE权限。

AS

 

  1. 创建一个名为FindCustomer1的存储过程,可以用它来找出SQL SERVER中的northwind数据库的Customer表中,CustomerID为指定值(输入参数)的记录的ContactName字段的名称,另外指定一个输出参数LineNum做为输出参数,还有必须在存储过程中判断CustomerID不能为空串,是的话要打印出出错信息,并返回错误值-1,如果查询成功在输出变量LineNum中保留选出的行数,然后返回值0。写出相应的SQL语句.

AS

  A  EXEC sp_helptext 'overdueOrders'

@CustomerID char(5)

GO

EXEC sp_addmessage

创建语句:

USE NorthWind

CREATE PROCEDURE dbo. FindCustomer

GO

SELECT  CustomerID  

@msgtext =  'Can’t find the customer ID:%s at table %s.',

$CustomerID char(5)

@CustomerID char (5)

 

 A

From Customers WHERE CustomerID=@CustomerID 

From Customers WHERE @CustomerID=CustomerID

 

@CustomerID= ‘thecr’

LIKE

5.      已经创建了一个从数据库中删除客户的存储过程。在删除事务完成时,希望有一个自定义的错误信息写入Windows 2000应用程序日志。如何执行该任务?

 

@CustomerID char (5)

USE northwind

      C

调用语句

BEGIN

USE NorthWind

答: 通过在sp_addmessage存储过程中指定@with_log参数创建一个自定义的错误信息。删除事务提交后,在存储过程中调用RAISERROR语句来生成自定义的错误信息。

CustomerID= ‘thecr’

B  EXEC sp_help overdueOrders

AS

USE northwind

IF @@ROWCOUNT=0

EXEC northwind.dbo. FindCustomer

B

调用语句

 

@with_log ='true'

@CustomerID= ‘thecr’

 

CREATE PROCEDURE dbo. FindCustomer

   RAISEERROR(50512, 10, 1, @ CustomerID, @DBNAME)

AS

    RETURN -1

CREATE PROC ExistCustomerID

含蓄事务和错误管理的蕴藏进度。答:

F   查询sysobjects系统表

SELECT contactName

SELECT contactName

GO

创建语句:

调用语句

GO

 

 

D  EXEC sp_depends 'overdueOrders'

CREATE PROC FindCustomer3

EXEC northwind.dbo. FindCustomer

USE northwind

SELECT  contactName  

From Customers WHERE CustomerID=@CustomerID

C  EXEC sp_stored_procedures 'overdueOrders'

@CustomerID char(5)

调用语句

  BEGIN

GO

 

 

SET @LineNum = @@ROWCOUNT

创建语句:

TAG标签:
版权声明:本文由彩民之家高手论坛发布于彩民之家高手论坛,转载请注明出处:含蓄事务和错误管理的蕴藏进度