仅当列不是1或0位时更新SQL server行
我想更新包含序列号(字符串)、布尔值(位)和日期(日期)的行。我希望在服务器端执行此操作,以便在该行被设置为false后,用户无法更改该行。否则,当该行设置为1(也称为true)时,该行可以自由编辑 我已经尝试编写一个触发器来完成这项工作,但是我无法让它在更新行之前解析该行,以确定它是否应该写入该行 比如说, 第1行:SN=123456,TorF=1,日期=01-31-2015::可以为较新的日期进行编辑/更新 第2行:SN=654321,TorF=0,Date=03-31-2015::这将无法更改,并将向用户抛出一个错误 编辑: 这是我试过的仅当列不是1或0位时更新SQL server行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想更新包含序列号(字符串)、布尔值(位)和日期(日期)的行。我希望在服务器端执行此操作,以便在该行被设置为false后,用户无法更改该行。否则,当该行设置为1(也称为true)时,该行可以自由编辑 我已经尝试编写一个触发器来完成这项工作,但是我无法让它在更新行之前解析该行,以确定它是否应该写入该行 比如说, 第1行:SN=123456,TorF=1,日期=01-31-2015::可以为较新的日期进行编辑/更新 第2行:SN=654321,TorF=0,Date=03-31-2015::这将无法
CREATE TRIGGER DisallowOnFailEdit
ON myTable
INSTEAD OF UPDATE
AS
IF EXISTS(SELECT myColumn FROM LoopBackCable WHERE myColumn = 0)
THROW 50000, 'Cable has been permanently retired', 1
ROLLBACK TRANSACTION;
您可以检查已删除表中的以下内容:
CREATE TRIGGER DisallowOnFailEdit
ON myTable
FOR UPDATE
AS
IF EXISTS(SELECT * FROM DELETED WHERE myColumn = 0)
BEGIN
THROW 50000, 'Cable has been permanently retired', 1
ROLLBACK TRANSACTION;
END
或与“而非触发器”相同:
CREATE TRIGGER DisallowOnFailEdit
ON myTable
INSTEAD OF UPDATE
AS
IF EXISTS(SELECT * FROM INSERTED i
JOIN myTable m on i.PK = m.PK WHERE m.myColumn = 0)
BEGIN
THROW 50000, 'Cable has been permanently retired', 1
ROLLBACK TRANSACTION;
END
UPDATE m
SET Col1 = i.Col1,
Col2 = i.Col2
....
FROM INSERTED i
JOIN myTable m on i.PK = m.PK
使用“代替”触发器。我试过了,但没有用。我已经发布了我从中得到一些结果的触发器。我现在只使用SQL几天了。请原谅我对基本知识一无所知。这就是你的全部触发码?使用而不是,如果逻辑要求,则需要在触发器代码中执行原始更新。您不需要回滚。顾名思义,触发器中的代码是执行的,而不是用户执行的原始更新。非常感谢您的回答。我发誓我已经尝试了您发布的第一个解决方案,即利用已删除的表。不管怎样,你已经解决了我的问题。再次感谢。