Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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
Sql server T-SQL如何防止删除表中的第一行_Sql Server_Database_Tsql - Fatal编程技术网

Sql server T-SQL如何防止删除表中的第一行

Sql server T-SQL如何防止删除表中的第一行,sql-server,database,tsql,Sql Server,Database,Tsql,我有一张这样的桌子: CREATE TABLE Users ( idUser int IDENTITY(1,1) PRIMARY KEY, firstName varchar(40) NOT NULL, secondName varchar(40), lastName varchar(70) NOT NULL, position varchar(80), section varchar(80) NOT NULL ) 有人只需要删除其中一个用户。如何防止删除第一行? 我无法重新插入,第

我有一张这样的桌子:

CREATE TABLE Users
(

    idUser int IDENTITY(1,1) PRIMARY KEY,
firstName varchar(40) NOT NULL,
secondName varchar(40),
lastName varchar(70) NOT NULL,
position varchar(80),
section varchar(80) NOT NULL
)
有人只需要删除其中一个用户。如何防止删除第一行?
我无法重新插入,第一行必须有idUser=1。

在这种情况下,您需要另一个“审核”表,该表将为每个用户保留记录,以防用户删除一条记录,用户详细信息将插入该表中,并在用户上创建一个Instead of delete触发器,该触发器检查该用户的详细信息是否存在于审核表中,然后阻止其进一步删除;如果该用户的详细信息不存在于审核表中,则允许删除该记录,并向该用户的审核表中添加一行,以防止该用户进一步删除该记录。

您应该将此类逻辑在您的业务(逻辑)层中。

检查要删除的用户是否没有UID=1

您可以在表[Users]上创建一个触发器,在删除此表中的寄存器时监视该触发器。所以,如果检查删除是否为userId:1,则不删除它,否则。。您删除它,下面是代码:

CREATE TRIGGER sampleTrigger
    ON [Users]
    INSTEAD OF DELETE
AS
    IF EXISTS(SELECT * FROM deleted WHERE idUser IN (1))
    BEGIN
        RAISERROR ('Is not allowed to delete idUser: 1',16, 1)  
    END
    ELSE
    BEGIN
        DELETE [Users] WHERE idUser IN (SELECT idUser FROM deleted)
    END
GO

但是这将删除此表中userid不是1的所有行,这是您想要做的吗???
并且某人只需要删除其中一个用户
=>显然不是:)这只是中缺少的
there@MostyMostacho我不知道她是什么意思,也不知道她想在这里实现什么:我想让使用我的应用程序的人可以如果此用户的ID与1不同,则仅删除一个用户。在这种情况下,您将需要另一个“审核”表,该表将为每个用户保留记录,以防用户删除一条记录,用户详细信息将插入该表中,并在用户上创建as而不是delete触发器,该触发器会在审核表中检查该用户的详细信息是否存在于审核表中,然后阻止其进一步删除,如果审核表中不存在,则允许删除记录。在Raiserror中,严重级别1不会引发任何错误,但会给出一条信息消息,表示不会导致您编写代码跳转到Catch块,代码执行将继续。。需要将其设置为至少16。
已删除
可以包含多行。您应该使用。。。idUser在哪里(选择…,这样它就允许多个chagnesAgreed。在触发器中隐藏业务逻辑有一个讨厌的习惯,以后会咬到你。正确控制谁通过域和api访问你的数据库更可取。@MikeParkhill-这两件事并不是相互排斥的。将此逻辑放在触发器中可以防止业务层中的bug,或者类似的情况如果数据库是通过某种方式访问的,而不是通过该层访问的,则逻辑被绕过。@MartinSmith如果一层中有逻辑,则其他层可以(并且大部分应该)访问忽略它。否则,SQL数据库和逻辑层似乎都重叠。@MikeParkhill您不能对设计发表评论,因为您不知道设计是什么!可能整个系统都在数据库中。可能删除该用户会产生可怕的后果,因此必须在顶层进行保护。可能存在合规性为什么要这么保护它。也许控制这些东西的合适的人有特别胖的手指。我们不知道,所以对设计发表评论是没有根据和没有帮助的。