有没有办法让所有DML语句都被搁置,直到满足条件?
情境:
有多个用户通过Windows应用程序同时与数据库交互。执行各种插入,更新,删除操作。
我有一个重要的程序:
Proc_SomeImportantWork
执行此过程时,只能执行此过程。除此之外的任何程序所做的新条目或修改等必须暂停或停止,只要Proc_SomeImportantWork
正常。
这可能吗?如果是,请指导我。谢谢。
答案 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会收到大量的电话。