前几天在写一个查询时,一个想法出现在我的脑海中。
什么是可取的,首先检查是否存在唯一列的值,然后插入或插入并让 db 引发唯一约束错误?它甚至会重要吗?
编辑:正如下面在回答这个问题取决于数据库时所建议的那样,我正在添加标签 postgresql。
使用 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 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) 我的 Ruby 应用程序中有以下 SQL 查询:
sql = "DELETE FROM `#{database}`.`table1` WHERE `same_id` = #{some_id};"
Run Code Online (Sandbox Code Playgroud)
问题是在极少数情况下table1可能不存在。我需要构造这个查询,所以即使表不存在 SQL 也不会抛出错误。
我该如何实施?
我有以下情况:
DB1(位于srv1服务器上)数据库的备份在每天凌晨 1:00 进行。
我备份了 2011 年 10 月 24 日的文件(数据文件、归档日志、控制文件、spfile),并将它们恢复到服务器srv2 上。
在恢复 Oracle 所需的日志文件期间:
RMAN-06054:介质恢复请求线程 1 的未知归档日志,序列为 228,起始 SCN 为 26651733
我在服务器srv1上搜索了该日志文件并将其复制到服务器srv2。将其注册到数据库并recover database再次运行命令。仍然是同样的错误,但与其他序列号和 SCN。
RMAN-06054:介质恢复请求线程 1 的未知归档日志,序列为 229,起始 SCN 为 26654944
这些归档日志是在 2011 年 10 月 24 日之后生成的,因此该日期的备份不应该知道更新的归档日志。我可以设置恢复直到那个序列,但我只是想知道 SCN 存储在哪里?为什么我的 Oracle 需要更新的归档日志?
服务器srv1和srv2没有相互联系。
非常感谢。
在我永无止境地寻求通过保存交易射击自己的过程中,我似乎找到了更多实现任务目的的方法。这次的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) 使用 BCP 命令,我正在生成 SQL Server DB 表的文件。当 BCP 命令无法将数据转储到文件中时,它会为每个表创建一个空文件。这可能是由写入的查询错误或传递给 BCP 命令的空变量引起的。
有什么方法可以将这些事件捕获为错误并使其返回一些错误代码?
我正在从存储过程执行此操作。有什么办法可以在 SP 中处理这个问题吗?
在我的环境中,我们有很多调用子过程的容器过程,这些过程可能会无限调用其他过程。
就我个人而言,我通常TRY/CATCH在每个级别的程序中使用。这有时会导致多个重复的错误消息,但很清楚发生了什么以及在什么过程中。
我有一些同事采取不同的方法。即: - 让每个存储的 proc 发出一个返回码 - 在执行后评估每个存储的 proc 的返回码 - 如果收到错误的返回码,则在最外层的 proc 中引发错误
我相信他们这样做,所以他们可以从示数程序实际行号(而不是让它返回的行号RAISERROR的CATCH块)。
对我来说,这似乎更难实现和维护,但我不是 SQL Server 错误处理方面的专家,所以我想我会在这里提出它。
在处理集装箱程序中的错误时,这两种方法是否有任何实质性优势?
sql-server stored-procedures sql-server-2008-r2 error-handling
我正在 Postgres 11.5 中编写一组存储函数,并且希望RAISE EXCEPTION在不满足各种先决条件时执行此操作。例如null需要一个字符串或者带字符串的空字符串,或者超出范围的整数参数等。
我可以RAISE EXCEPTION提供详细信息、提示和消息...但是错误代码应该使用什么范围?我检查了文档,但没有在这里找到任何指导:
https://www.postgresql.org/docs/11/errcodes-appendix.html
我在 StackOverflow 上搜索,发现几年前有一个类似的问题......但没有明确的答案。
是否有一些块或前缀可以安全或常规地用于从存储的函数/过程返回的自定义错误代码?
考虑以下用户无权执行的 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)
当 ANSI_WARNINGS=OFF 时,权限违规会导致事务中止。
但是,我收到以下错误,如 dbfiddle 中所示:
消息 3930 级别 16 状态 1 第 11 行 当前事务无法提交,并且无法支持写入日志文件的操作。回滚事务。
消息 3998 级别 16 状态 1 第 1 行 在批处理结束时检测到不可提交的事务。事务被回滚。
除了调用 SP_TRACE_GENERATEEVENT 之外,其他类型的安全问题也可能会发生此问题。例如,我在尝试查询用户无法连接到该数据库的表时看到过它。我没有完整的错误案例列表。
为什么权限错误会导致XACT_ABORTset toOFF和ANSI_WARNINGSset to 的事务失败ON?
error-handling ×10
sql-server ×5
postgresql ×2
t-sql ×2
backup ×1
bcp ×1
logs ×1
mysql ×1
oracle ×1
parameter ×1
performance ×1
plpgsql ×1
query ×1
recovery ×1
rman ×1