如何在数据库中保留DML语句?

时间:2015-03-26 11:58:25

标签: c# .net sql-server stored-procedures ado.net

有没有办法让所有DML语句都被搁置,直到满足条件?

情境:
有多个用户通过Windows应用程序同时与数据库交互。执行各种插入,更新,删除操作。

我有一个重要的程序:

Proc_SomeImportantWork

执行此过程时,只能执行此过程。除此之外的任何程序所做的新条目或修改等必须暂停或停止,只要Proc_SomeImportantWork正常。

这可能吗?如果是,请指导我。谢谢。

2 个答案:

答案 0 :(得分:0)

如果您可以控制其他用户的DML,则可以使用应用程序锁定。

如果没有,请打开一个事务,对要使用TABLOCKX提示(SELECT * FROM tbl WHERE 1=0 WITH(TABLOCKX, HOLDLOCK))锁定的表发出noop select。然后从同一个会话中运行该过程,并在完成后提交。

答案 1 :(得分:0)

您可以像这样创建一个ddl数据库触发器:

create trigger  error2 on database   for CREATE_TABLE,
ALTER_TABLE,
DROP_TABLE 
as
   begin
         if USER_NAME()<>'dbo'
         begin
             RAISERROR('All changes are currently not allowed -                Please     call Mary at x1234
             <schema change>.', 10, 1);
              rollback
          end
end

这将在数据库级别创建一个触发器,该触发器将禁止除dbo之外的任何人创建,更改或删除表,直到删除或禁用触发器。

当我以非dba身份登录并尝试创建表时,会显示此消息:

All changes are currently not allowed - Please call Mary at x1234
<schema change>.
Msg 3609, Level 16, State 2, Line 1

要查看您可以捕获的活动列表,请参阅:https://technet.microsoft.com/en-us/library/bb522542%28v=sql.105%29.aspx并浏览一下您可以控制的其他活动。

当你完成后,你可能想要禁用触发器,否则你或者Mary会收到大量的电话。