触发器用RAISERROR,能不能只提示,不影响保存

weisaisz 2016-12-16 02:56:09
由于程序没有源码,控制只能用触发器。
但是客户要求检查结果给提示,仅仅提醒,但是不影响正常保存

如果这样,就直接不提示了
RAISERROR('超过最大值',10,1)

如果这样,提示了,但是数据不能保存
RAISERROR('超过最大值',16,1)

有没有解决方法
谢谢


...全文
1092 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2016-12-17
  • 打赏
  • 举报
回复
这样的实现不推荐,提示信息最好放在存储过程里去处理,别用触发器去做这类提示工作,大材小用,明白?
weisaisz 2016-12-17
  • 打赏
  • 举报
回复
引用 12 楼 roy_88 的回复:
程序不加事务,直接调用命令 给你测个例子: 搭建环境:数据库名:SampleDB
USE SampleDB
GO

CREATE TABLE TTestTri(ID int);
GO
CREATE TRIGGER tr_cTTestTri ON TTestTri
AFTER INSERT
AS
RAISERROR('Error:2',16,1)

go
C#:
try
            {
                SqlConnection thisConn = new SqlConnection(@"Server=(Local);Database=SampleDB;Integrated Security=True");
                SqlCommand thisComm = new SqlCommand("INSERT INTO dbo.TTestTri(ID)VALUES(2);", thisConn);
                thisConn.Open();
                thisComm.ExecuteScalar();
                thisConn.Close();
            }
            catch(Exception ex) {
               Console.WriteLine(ex.Message);
            }
            Console.ReadKey();
明白 但是现在没有源码,否则直接源码中提醒是最好的方法 而且SQL脚本是内编码,如果是存储过程用了事务,反而好办一些
中国风 2016-12-16
  • 打赏
  • 举报
回复
程序不加事务,直接调用命令 给你测个例子: 搭建环境:数据库名:SampleDB
USE SampleDB
GO

CREATE TABLE TTestTri(ID int);
GO
CREATE TRIGGER tr_cTTestTri ON TTestTri
AFTER INSERT
AS
RAISERROR('Error:2',16,1)

go
C#:
try
            {
                SqlConnection thisConn = new SqlConnection(@"Server=(Local);Database=SampleDB;Integrated Security=True");
                SqlCommand thisComm = new SqlCommand("INSERT INTO dbo.TTestTri(ID)VALUES(2);", thisConn);
                thisConn.Open();
                thisComm.ExecuteScalar();
                thisConn.Close();
            }
            catch(Exception ex) {
               Console.WriteLine(ex.Message);
            }
            Console.ReadKey();
weisaisz 2016-12-16
  • 打赏
  • 举报
回复
引用 8 楼 misterliwei 的回复:
关键是0-10能触发try catch吗?客户端很可能显示消息和撤销保持都是在catch里面完成的。
10没有提示能保存,16有提示不能保存
weisaisz 2016-12-16
  • 打赏
  • 举报
回复
引用 6 楼 wmxcn2000 的回复:
是因为保存失败才有的提示吗 ?
保存数据本身没有问题的,是我加了。如果禁止触发器,保存没问题 alter TRIGGER [dbo].[Tri_t_Table_2Update] ON [dbo].[Table_2] AFTER INSERT AS SET NOCOUNT ON IF @@Error = 0 BEGIN RAISERROR('test123111',10,1) with NOWAIT END GO
weisaisz 2016-12-16
  • 打赏
  • 举报
回复
引用 7 楼 roy_88 的回复:
触发器不是这样用的,提示信息放在存储过程里去OUTPUT 触发器检查时,成功保存,不成功抛错信息,程序可获取抛出错误信息 如你的环境,要抛出又要保存数据,可以处理,在外层不加事务就行,加了事务会回滚
你的意思是程序现在的保存,是使用事务,所以触发器抛出错误,就整个回滚,所以保存不成功。 你说的外层不加事务,具体要怎没操做。是需要修改原来保存的脚本?但是脚本都是内编码了,而且没有源码。 能在触发器中加什么设置,表示这个触发不受事务影响吗?
misterliwei 2016-12-16
  • 打赏
  • 举报
回复
关键是0-10能触发try catch吗?客户端很可能显示消息和撤销保持都是在catch里面完成的。
中国风 2016-12-16
  • 打赏
  • 举报
回复
触发器不是这样用的,提示信息放在存储过程里去OUTPUT 触发器检查时,成功保存,不成功抛错信息,程序可获取抛出错误信息 如你的环境,要抛出又要保存数据,可以处理,在外层不加事务就行,加了事务会回滚
卖水果的net 版主 2016-12-16
  • 打赏
  • 举报
回复
是因为保存失败才有的提示吗 ?
中国风 2016-12-16
  • 打赏
  • 举报
回复
看MSDN错误级别说明 0~10是提示信息,不影响保存数据 11~19 在CATCH可获取错误,影响事务 20以上终止数据库连接
weisaisz 2016-12-16
  • 打赏
  • 举报
回复
引用 2 楼 roy_88 的回复:
默认情况下,将严重性在 1 到 10 之间的消息的 @@ERROR 设置为 0 PRINT 语句不受 TRY 块的影响,而在严重级别为 11 到 19 的情况下在 TRY 块中运行的 RAISERROR 会将控制传输至关联的 CATCH 块。 指定严重级别为 10 或更低以使用 RAISERROR 返回 TRY 块中的消息,而不必调用 CATCH 块。 <=10为信息文件提示,设置@@ERROR=0
设置@@ERROR=0? alter TRIGGER [dbo].[Tri_t_Table_2Update] ON [dbo].[Table_2] AFTER INSERT AS SET NOCOUNT ON IF @@Error = 0 BEGIN RAISERROR('test123111',10,1) with NOWAIT END GO 这样不提示,正常保存 如果把10改成16,提示,不能保存
weisaisz 2016-12-16
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
这个提示必须由程序来捕捉; 触发器到不了程序界面; 只提示不保存的话,就不能用 raiserror ;
要的是提示,不影响保存 现在提示,不能保存
中国风 2016-12-16
  • 打赏
  • 举报
回复
默认情况下,将严重性在 1 到 10 之间的消息的 @@ERROR 设置为 0 PRINT 语句不受 TRY 块的影响,而在严重级别为 11 到 19 的情况下在 TRY 块中运行的 RAISERROR 会将控制传输至关联的 CATCH 块。 指定严重级别为 10 或更低以使用 RAISERROR 返回 TRY 块中的消息,而不必调用 CATCH 块。 <=10为信息文件提示,设置@@ERROR=0
卖水果的net 版主 2016-12-16
  • 打赏
  • 举报
回复
这个提示必须由程序来捕捉; 触发器到不了程序界面; 只提示不保存的话,就不能用 raiserror ;

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧