运行alter procedure时不保存对过程的更改

时间:2015-07-07 14:48:29

标签: sql-server sql-server-2008 stored-procedures sql-server-2012

Sql server 2012中有一个名为“proc1”的存储过程。我已经采用了过程脚本,然后实现了异常处理(Begin Try ... End Try Begin Catch ... End Catch)。

我将“Create procedure proc1”语句更改为“Alter procedure proc1”然后执行它。它成功完成但是当我尝试再次获得相同的过程脚本时。我找不到异常处理部分。代码看起来像旧的存储过程代码。

我想知道这是可能的。即使我没有权限,它也应该在“alter procedure proc1”编译期间返回错误消息。

1 个答案:

答案 0 :(得分:0)

了解存储过程是数据库的一部分很重要。这意味着它们的行为与使用 DDL(数据定义语言)语句(例如表)定义的任何其他“正常”对象一样。因此:

  • 事务适用于 DDL(数据定义语言)语句,包括 CREATE PROCEDURE/ALTER PROCEDURE。因此,如果您用来更改过程的会话在一个事务中,而您从未提交该事务,那么更改将被回滚。
  • 过程的内容是数据库的一部分,因此恢复数据库的备份不仅会恢复数据,还会恢复对过程的更改。

如您所说,如果出现错误导致数据库完全拒绝您的更改,您在尝试执行时应该会收到一个明显的错误,并且不会进行更改。例如,如果 ALTER PROCEDURE 命令本身存在语法错误,您将在没有执行任何批处理的情况下收到错误消息。或者,如果您的过程主体引用了现有表中不存在的列,Transact-SQL 可能会选择验证该过程并拒绝更改(如果该表不存在,它会接受该更改并且只是在以下情况下无法运行该过程)尝试稍后执行它,因为 Transact-SQL 可以说与它本身不一致)。