如何在不使用RAISERROR()的情况下使T-SQL脚本失败?

时间:2012-11-20 21:12:01

标签: sql-server sql-server-2008 tsql

这就是我想要实现的目标:

检查SQL Server代理作业的第一步中数据库是否为只读。如果是这种情况 - 退出工作。

所以我想我将使用“高级属性”作业步骤并选择“退出作业报告成功”为“失败阳离子:”

但是如何在不使用RAISERROR()的情况下使T-SQL脚本失败?原因我不想使用RAISERROR()是因为需要成为sysadmin服务器角色的成员才能使用它。

我找到了相当丑陋的方法 - 从表中选择不存在的东西,脚本看起来像这样:

declare @DBIsRO int;

SET @DBIsRO= (SELECT is_read_only
FROM sys.databases
WHERE name = 'test')

IF @DBIsRO=1 
   select * from dd -- table dd doesn't exist in current database

然而,这看起来像是一个kludge,我正在寻找一种“正确”的方法。

2 个答案:

答案 0 :(得分:5)

重读文档:

  

任何用户都可以指定从0到18的严重级别。   从19到25的严重级别只能由成员指定   系统管理员......

你可以这样做:

raiserror( 'Readonly',16,1)

答案 1 :(得分:0)

  

原因我不想使用RAISERROR()是因为需要成为sysadmin服务器角色的成员才能使用它。

如果那是真的,没有人会使用它。根本不是真的。 spec says

  

任何用户都可以指定从0到18的严重级别。   从19到25的严重级别只能由成员指定   sysadmin固定服务器角色或具有ALTER TRACE权限的用户。

即使这是真的,您也可以使用code signing来利用它。但根本没有必要。