CREATE TRIGGER tri_idcheckON table_ticketBEFORE INSERTASBEGIN IF LEN(INSERTED.passenger_id) < 18 BEGIN SET INSERTED.passenger_id = 'error'; ENDEND;报错'BEFORE' 不是可以识别的 触发器。请修改使得sql server能运行
时间: 2024-02-16 13:00:23 浏览: 27
根据 SQL Server 的语法,应该将关键字 `ON` 放在触发器名字和表名之间,并且在 `BEFORE INSERT` 之前添加 `FOR`,同时在触发器体的开头使用 `SET NOCOUNT ON`,以避免返回不必要的计数信息。因此,正确的代码应该是:
```
CREATE TRIGGER tri_idcheck
ON table_ticket
FOR INSERT
AS
BEGIN
SET NOCOUNT ON;
IF LEN((SELECT passenger_id FROM INSERTED)) < 18
BEGIN
RAISERROR('Error: passenger_id too short!', 16, 1);
ROLLBACK TRANSACTION;
END
END;
```
这个触发器会在插入数据到 `table_ticket` 表之前执行,并检查插入的数据中 `passenger_id` 字段的长度是否小于 18。如果是,则触发器会抛出一个错误,并且自动回滚事务,以防止数据插入到表中。注意,在触发器体中使用 `SELECT` 语句来访问插入的数据,而不是直接使用 `INSERTED` 表。
相关问题
create trigger tri_idcheck before insert on table_ticket for each row begin IF LENGTH(NEW.passenger_id)< 18 THEN SET NEW.passenger_id= 'error' ; END IF; end ;改写成sql server语言
在 SQL Server 中,可以使用类似以下的语法来创建一个与 MySQL 中所述功能相同的触发器:
```
CREATE TRIGGER tri_idcheck
ON table_ticket
BEFORE INSERT
AS
BEGIN
IF LEN(INSERTED.passenger_id) < 18
BEGIN
SET INSERTED.passenger_id = 'error';
END
END;
```
需要注意的是,SQL Server 中使用 `INSERTED` 关键字代替 MySQL 中的 `NEW` 来引用要插入的新行数据。此外,`LENGTH` 函数在 SQL Server 中被替换为 `LEN` 函数。
CREATE TRIGGER tri_Insert_S ON S After INSERT,UPDATE AS IF EXISTS (SELECT * FROM INSERTED WHERE isnull(Sage,18)>18 and <=25) begin print '不是18-25期间 加入失败' rollback end
这个触发器的作用是在S表中插入或更新数据后,如果插入的年龄不在18到25岁之间,则会回滚操作并打印"不是18-25期间 加入失败"。
其中,INSERTED是SQL Server中的一个特殊表,它存储了刚刚插入或更新的数据,可以在触发器中使用。isnull(Sage,18)表示如果Sage为空,则将其默认值设置为18。而<=25则是一个语法错误,应该是写成Sage<=25。最终的代码如下:
```
CREATE TRIGGER tri_Insert_S ON S AFTER INSERT, UPDATE
AS
BEGIN
IF EXISTS (SELECT * FROM INSERTED WHERE Sage IS NULL OR Sage < 18 OR Sage > 25)
BEGIN
PRINT '不是18-25期间 加入失败'
ROLLBACK
END
END
```