Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅当列不是1或0位时更新SQL server行_Sql_Sql Server_Tsql - Fatal编程技术网

仅当列不是1或0位时更新SQL server行

仅当列不是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::这将无法

我想更新包含序列号(字符串)、布尔值(位)和日期(日期)的行。我希望在服务器端执行此操作,以便在该行被设置为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几天了。请原谅我对基本知识一无所知。这就是你的全部触发码?使用而不是,如果逻辑要求,则需要在触发器代码中执行原始更新。您不需要回滚。顾名思义,触发器中的代码是执行的,而不是用户执行的原始更新。非常感谢您的回答。我发誓我已经尝试了您发布的第一个解决方案,即利用已删除的表。不管怎样,你已经解决了我的问题。再次感谢。