人生中第一个带参数触发器

create trigger portGo
after insert on wc
for each row
begin
select count(*) into @num from dataIn where port = new.name;
if @num=0 then
insert into dataIn values ('4',new.name);
end if;
end$


是这样的,在做海运报价查询系统里,所有的港口,要重新统计整理嘛,故使用触发器来实现吧。

wc表是用来插入海运数据的。

dataIn表是原对照的port.

当有导入数据时,若是新港口,刚自动更新到dataIn中。


create trigger portAutoAdd
after insert on seaend 
for each row  
begin  
select count(id) into @num from seaport where shortName = new.endP;  
if @num=0 then  
insert into seaport (shortName) values (new.endP);  
end if;  
end$


### SQL Server 触发器作为查询批次中第一个语句的实现方法或修改方式 在 SQL Server 中,触发器本质上是一种特殊的存储过程,它会在指定的数据表上自动执行,而不需要用户直接调用[^1]。为了确保触发器是查询批次中的第一个语句,需要满足以下条件: 1. **触发器定义的语法要求**:触发器的定义必须符合 SQL Server 的语法规则,并且不能包含任何违反批次执行顺序的语句。例如,触发器中不能包含 `GO` 语句,因为 `GO` 是一个批处理分隔符[^1]。 2. **触发器的创建与修改**:如果需要修改现有触发器以确保它是查询批次中的第一个语句,可以通过 `ALTER TRIGGER` 语句来重新定义触发器逻辑。以下是修改触发器的代码示例: ```sql -- 修改触发器以确保它是查询批次中的第一个语句 ALTER TRIGGER trg_ExampleTrigger ON YourTableName AFTER INSERT, UPDATE, DELETE AS BEGIN -- 确保触发器逻辑不包含 GO 或其他影响批次顺序的语句 SET NOCOUNT ON; -- 触发器逻辑 IF EXISTS (SELECT 1 FROM inserted) AND NOT EXISTS (SELECT 1 FROM deleted) BEGIN -- 插入操作的逻辑 PRINT 'Insert operation detected'; END ELSE IF EXISTS (SELECT 1 FROM deleted) AND NOT EXISTS (SELECT 1 FROM inserted) BEGIN -- 删除操作的逻辑 PRINT 'Delete operation detected'; END ELSE IF EXISTS (SELECT 1 FROM inserted) AND EXISTS (SELECT 1 FROM deleted) BEGIN -- 更新操作的逻辑 PRINT 'Update operation detected'; END END; ``` 3. **确保触发器逻辑的独立性**:触发器的逻辑应该尽量保持独立,避免依赖外部变量或上下文。这样可以确保触发器在任何查询批次中都能正确执行。 4. **优化触发器性能**:如果触发器涉及到复杂的查询或数据操作,可能会对系统性能产生影响。在这种情况下,可以通过优化触发器中的 SQL 查询来提高性能[^3]。例如,使用索引、减少不必要的联接操作等。 5. **验证触发器的执行顺序**:如果数据库中存在多个触发器,SQL Server 会按照定义的顺序执行这些触发器。可以通过 `sp_settriggerorder` 存储过程来设置触发器的执行顺序[^1]。以下是一个设置触发器执行顺序的示例: ```sql -- 设置触发器第一个执行 EXEC sp_settriggerorder @triggername = 'trg_ExampleTrigger', @order = 'First', @stmttype = 'INSERT'; ``` ### 注意事项 - 触发器的定义和修改需要管理员权限。 - 如果触发器逻辑复杂,建议对其进行单元测试,以确保其在不同场景下的正确性。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值