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您不能对设计发表评论,因为您不知道设计是什么!可能整个系统都在数据库中。可能删除该用户会产生可怕的后果,因此必须在顶层进行保护。可能存在合规性为什么要这么保护它。也许控制这些东西的合适的人有特别胖的手指。我们不知道,所以对设计发表评论是没有根据和没有帮助的。