标签: error-handling

检查唯一列的值是否存在或让 db 在插入时引发唯一错误的优缺点

前几天在写一个查询时,一个想法出现在我的脑海中。

什么是可取的,首先检查是否存在唯一列的值,然后插入或插入并让 db 引发唯一约束错误?它甚至会重要吗?

编辑:正如下面在回答这个问题取决于数据库时所建议的那样,我正在添加标签 postgresql。

postgresql performance error-handling

9
推荐指数
2
解决办法
1365
查看次数

写入错误日志

使用 SQL Server 2008 R2:

如何写入 SQL Server 错误日志?我有一个 ROLLBACK 语句,我想将它与写入错误日志的语句结合起来用于外部监控。

例子:

BEGIN TRAN

INSERT INTO table1
SELECT * 
FROM table2

IF @@ERROR <> 0
BEGIN
    ROLLBACK TRAN
    --Write to log
    RETURN
END

COMMIT TRAN
Run Code Online (Sandbox Code Playgroud)

编辑:

我想澄清一下 - 我想写入对象资源管理器中“管理”文件夹下的“SQL Server 日志”、“当前”日志。

sql-server logs sql-server-2008-r2 error-handling

8
推荐指数
3
解决办法
1万
查看次数

如果存储过程在 TRY / CATCH 中失败,则未设置输出参数

在 SQL Server 2008 中(但也在 2014 年)。让我们考虑一个具有输出参数的过程。此过程可能会产生错误(并且会在以下示例中产生)。我注意到如果我们在TRY/CATCH块中调用过程,输出参数的行为是不一样的。

例子:

create procedure test_output @result varchar(10) output
as
begin
    set @result = 'hello'
    raiserror('This is an error', 16,1)
    set @result = 'error'
end
Run Code Online (Sandbox Code Playgroud)

如果我们以简单的方式启动程序:

declare @res1 varchar(10)
exec test_output @result = @res1 out
print 'Result is: '+ isnull(@res1, 'empty')
Run Code Online (Sandbox Code Playgroud)

我们得到(我很好):

Msg 50000, Level 16, State 1, Procedure test_output, Line 7 [Batch Start Line 12]
这是一个错误
结果是:错误

如果过程现在在 try/catch 块中:

declare @res2 varchar(10)
declare @error_message varchar(max)
begin try
    exec test_output …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql parameter error-handling

8
推荐指数
1
解决办法
4120
查看次数

删除记录前需要检查表是否存在

我的 Ruby 应用程序中有以下 SQL 查询:

sql = "DELETE FROM `#{database}`.`table1` WHERE `same_id` = #{some_id};"
Run Code Online (Sandbox Code Playgroud)

问题是在极少数情况下table1可能不存在。我需要构造这个查询,所以即使表不存在 SQL 也不会抛出错误。

我该如何实施?

mysql query error-handling

7
推荐指数
2
解决办法
3万
查看次数

RMAN-06054:介质恢复请求未知的归档日志,SCN 保存在哪里?

我有以下情况:

  1. DB1(位于srv1服务器上)数据库的备份在每天凌晨 1:00 进行。

  2. 我备份了 2011 年 10 月 24 日的文件(数据文件、归档日志、控制文件、spfile),并将它们恢复到服务器srv2 上。

  3. 在恢复 Oracle 所需的日志文件期间:

    RMAN-06054:介质恢复请求线程 1 的未知归档日志,序列为 228,起始 SCN 为 26651733

  4. 我在服务器srv1上搜索了该日志文件并将其复制到服务器srv2。将其注册到数据库并recover database再次运行命令。仍然是同样的错误,但与其他序列号和 SCN。

    RMAN-06054:介质恢复请求线程 1 的未知归档日志,序列为 229,起始 SCN 为 26654944

这些归档日志是在 2011 年 10 月 24 日之后生成的,因此该日期的备份不应该知道更新的归档日志。我可以设置恢复直到那个序列,但我只是想知道 SCN 存储在哪里?为什么我的 Oracle 需要更新的归档日志?

服务器srv1和srv2没有相互联系。

非常感谢。

oracle backup rman recovery error-handling

7
推荐指数
1
解决办法
2万
查看次数

CATCH 块在不应触发时被触发

在我永无止境地寻求通过保存交易射击自己的过程中,我似乎找到了更多实现任务目的的方法。这次的save transaction子句本身是没问题的,不过正因为如此,我才写了下面的代码。

考虑以下带有嵌套错误处理程序的完整示例:

begin try

  begin try
    select 'Step 1';
  end try
  begin catch
    select 'Step 1 handler - handling ''' + error_message() + '''';
    goto commit_and_exit;
  end catch;

  begin try
    select 'Step 2';
    raiserror('Step 2 error', 16, 1);
  end try
  begin catch
    select 'Step 2 handler - handling ''' + error_message() + '''';
    goto commit_and_exit;
  end catch;

end try
begin catch
  select 'Outer handler - handling ''' + error_message() + '''';
  goto commit_and_exit;
end catch

commit_and_exit:

raiserror('Error raised for …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 stored-procedures t-sql error-handling

7
推荐指数
1
解决办法
1096
查看次数

如果 BCP 命令无法将数据转储到文件中,则引发错误

使用 BCP 命令,我正在生成 SQL Server DB 表的文件。当 BCP 命令无法将数据转储到文件中时,它会为每个表创建一个空文件。这可能是由写入的查询错误或传递给 BCP 命令的空变量引起的。

有什么方法可以将这些事件捕获为错误并使其返回一些错误代码?

我正在从存储过程执行此操作。有什么办法可以在 SP 中处理这个问题吗?

sql-server stored-procedures bcp error-handling

7
推荐指数
1
解决办法
1万
查看次数

容器过程中的错误处理

我知道并使用了这个问题中的技术。

在我的环境中,我们有很多调用子过程的容器过程,这些过程可能会无限调用其他过程。

就我个人而言,我通常TRY/CATCH在每个级别的程序中使用。这有时会导致多个重复的错误消息,但很清楚发生了什么以及在什么过程中。

我有一些同事采取不同的方法。即: - 让每个存储的 proc 发出一个返回码 - 在执行后评估每个存储的 proc 的返回码 - 如果收到错误的返回码,则在最外层的 proc 中引发错误

我相信他们这样做,所以他们可以从示数程序实际行号(而不是让它返回的行号RAISERROR的CATCH块)。

对我来说,这似乎更难实现和维护,但我不是 SQL Server 错误处理方面的专家,所以我想我会在这里提出它。

在处理集装箱程序中的错误时,这两种方法是否有任何实质性优势?

sql-server stored-procedures sql-server-2008-r2 error-handling

6
推荐指数
1
解决办法
2019
查看次数

Postgres 存储函数的自定义错误代码类和编号

我正在 Postgres 11.5 中编写一组存储函数,并且希望RAISE EXCEPTION在不满足各种先决条件时执行此操作。例如null需要一个字符串或者带字符串的空字符串,或者超出范围的整数参数等。

我可以RAISE EXCEPTION提供详细信息、提示和消息...但是错误代码应该使用什么范围?我检查了文档,但没有在这里找到任何指导:

https://www.postgresql.org/docs/11/errcodes-appendix.html

我在 StackOverflow 上搜索,发现几年前有一个类似的问题......但没有明确的答案。

是否有一些块或前缀可以安全或常规地用于从存储的函数/过程返回的自定义错误代码?

postgresql error-handling plpgsql

6
推荐指数
1
解决办法
1748
查看次数

为什么权限错误会导致 XACT_ABORT 设置为 OFF 且 ANSI_WARNINGS 设置为 ON 的事务失败?

考虑以下用户无权执行的 T-SQL SP_TRACE_GENERATEEVENT:

SET XACT_ABORT OFF;

SET ANSI_WARNINGS ON;

BEGIN TRANSACTION;

BEGIN TRY
    EXEC SP_TRACE_GENERATEEVENT;
END TRY
BEGIN CATCH
END CATCH;

COMMIT TRANSACTION;
Run Code Online (Sandbox Code Playgroud)

我不希望根据以下文档SET XACT_ABORT收到错误:

当 ANSI_WARNINGS=OFF 时,权限违规会导致事务中止。

但是,我收到以下错误,如 dbfiddle 中所示:

消息 3930 级别 16 状态 1 第 11 行 当前事务无法提交,并且无法支持写入日志文件的操作。回滚事务。

消息 3998 级别 16 状态 1 第 1 行 在批处理结束时检测到不可提交的事务。事务被回滚。

除了调用 SP_TRACE_GENERATEEVENT 之外,其他类型的安全问题也可能会发生此问题。例如,我在尝试查询用户无法连接到该数据库的表时看到过它。我没有完整的错误案例列表。

为什么权限错误会导致XACT_ABORTset toOFF和ANSI_WARNINGSset to 的事务失败ON?

sql-server error-handling

6
推荐指数
1
解决办法
647
查看次数