使用SQL触发器检查数据库中是否存在字段

使用SQL触发器检查数据库中是否存在字段,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个数据库用户,它有四个字段:名称,客户端,ID,时间客户端是一个整数(0-99)。如何在插入期间编写触发器,从用户中查找最新用户(根据时间最新),如果此用户的客户端等于插入用户的客户端,则我要回滚 我试着这样做: CREATE TRIGGER DoubledData ON Users FOR INSERT AS DECLARE @client DECIMAL(2) DECLARE @client_old DECIMAL(2) DECLARE @name Varchar(50) SELECT

我有一个数据库用户,它有四个字段:名称客户端ID时间客户端是一个整数(0-99)。如何在插入期间编写触发器,从用户中查找最新用户(根据时间最新),如果此用户的客户端等于插入用户的客户端,则我要回滚

我试着这样做:

CREATE TRIGGER DoubledData ON Users
FOR INSERT
AS
DECLARE @client DECIMAL(2)
DECLARE @client_old DECIMAL(2)
DECLARE @name Varchar(50)
SELECT @name = Name from inserted
SELECT @client = Client from inserted

//This doesn't work, "Syntax error near Select":
SELECT @client_old = Select top(1) Client from Users where Name like @name order by Time desc;

IF @client = @client_old
BEGIN
    ROLLBACK
END

问题是,我可以为一个用户为客户端分配相同的值,但不能一个接一个地分配(例如,对于客户端,此顺序正确1-2-3-1-3->顺序很重要,但这不正确:1-2-3-3->在一行中第二次出现“3”后,需要回滚)

我正在使用MS SQL

[编辑] 我发现我可以执行它,而无需选择top(1)
如:

SELECT @client_old = Client from Users where Name like @name order by Time desc;

但是触发器不会在insert之后执行,首先,您显然不了解SQL Server中的触发器和inserted的伪表。它们可以有多行,因此当插入多行时,代码将失败。遗憾的是,这种情况下没有编译检查。而且代码可能会意外失败(唉,即使在生产环境中也是如此)

其次,正确的方法可能是使用唯一的约束。这将是:

alter table users
    add constraint unq_users_name_client unique (name, client);

这将确保没有重复,因此这是一种比您的触发器更严重的情况。

您能解释一下什么不起作用吗?你有什么价值?您期望哪一个?我无法在中设置@client\u old:SELECT@client\u old=从用户中选择顶级(1)客户端,其中的名称如@Name order by Time desc;在这种情况下,我似乎无法使用Select,因此我不知道如何分配它(我必须使用空格)//Select附近的语法不正确问题是,我可以为一个用户向客户端分配相同的值,但它们不能一个接一个(例如,对于客户端,此订单是正确的1-2-3-1-3->订单很重要,但这不正确:1-2-3-3->在一行中第二次出现“3”后,需要回滚)。或者是否有其他方法检查它,因为向DB发送最后一个用户的请求是无效的effective@extra2你应该把这个非常重要的信息和你的问题放在一起。按照我对你原来问题的理解,这个答案是正确的,但是现在你在这个评论中更改了这个问题。请编辑你的问题并把这个信息放在那里