16,471
社区成员
发帖
与我相关
我的任务
分享
CREATE TRIGGER TR_TEST on test
AFTER INSERT, DELETE, UPDATE
AS
SET NOCOUNT ON
DECLARE @sum_col2 real
select @sum_col2 =(select sum(t.col2) from test t, DELETED d where t.col3=d.col1)
if(@sum_col2 >100) -- 确保col2之和不大于100
begin
raiserror ('Col2之合不能大于100!',16,1) --抛出错误
rollback transaction
end
SET NOCOUNT OFF
CString sValue, sql;
float fValue;
CADORecordset* prs=new CADORecordset(&pDoc->m_adoConn);
try
{
DWORD dwID=5; // COL1=5的记录
sql.Format(_T("SELECT * FROM test WHERE COL1=%d;"), dwID);
// 更新数据库数据
if(prs->Open(sql, CADORecordset::openUnknown))
{
prs->MoveFirst();
prs->SetFieldValue(_T("COL2"), 20); // <--修改记录,将COL2的值从10修改为20;
if(!prs->Update()) {prs->Close(); delete prs;} // 【疑问1】<--能成功执行,没有捕捉到错误消息,通过打开SQL Server服务器之后查看数据并没有被修改,应该是被服务器的 触发器 回滚了。
}
// 读取更新后的数据库数据
prs->GetFieldValue(_T("COL2"), fValue); // 【疑问2】<--在执行完上述更新语句之后能获得COL1=5的这条记录COL2的值是修改后的20????
prs->Close(); // 【疑问3】<--执行到此处捕捉到错误,即跳转到catch块
delete prs;
}
catch (_com_error e)
{
MessageBox(e.ErrorDescription()); // 弹出对话框提示“Col2之合不能大于100!”
}