我正在為一個班級專案做一個觸發器。
我有一個salesman名為type. 表中的所有員工目前擁有type的full,part或temp。
觸發器的目的是檢查新插入的行type并確保它與已存在的三個行之一匹配。如果是,它應該允許插入,如果不是,它應該停止它或回滾它。感謝您的任何想法!
這是代碼的最新排列。
CREATE TRIGGER trg_validate_emp_type
ON salesman
FOR INSERT
AS
BEGIN
DECLARE @job varchar (20)
SELECT @job = (SELECT type FROM inserted)
IF NOT EXISTS (SELECT 1 FROM salesman WHERE UPPER(type) = UPPER(@job))
BEGIN
ROLLBACK TRANSACTION
PRINT 'employee type not valid'
END
END
uj5u.com熱心網友回復:
正如一些人指出的那樣,這看起來像是檢查約束或外鍵的作業。
例如
create table salesman(id int primary key, type varchar(20) check (type in ('a','b')))
或者
create table salesman_type (type varchar(20) primary key )
create table salesman(id int primary key, type varchar(20) references salesman_type)
但是如果你真的想寫一個觸發器來阻止插入表中不存在的值,你可以這樣做:
use tempdb
go
create table salesman
(
id int identity primary key,
type varchar(20) not null,
index ix_salesman_type(type)
)
insert into salesman(id,type) values (1,'a')
insert into salesman(id,type) values (2,'b')
go
CREATE OR ALTER TRIGGER trg_validate_emp_type
ON salesman
FOR INSERT
AS
BEGIN
IF EXISTS
(
SELECT *
FROM inserted
WHERE type not in
(
select type
from salesman
where id not in (select id from inserted)
)
)
BEGIN
throw 50001, 'employee type not valid', 1;
END
END
go
insert into salesman(id,type) values (3,'c') -- fails
insert into salesman(id,type) values (3,'a') -- succeeds
由于 XACT_ABORT 在觸發器中默認為 ON,您可以簡單地 THROW 而不是 ROLLBACK PRINT,并且客戶端會得到更好的錯誤訊息。
uj5u.com熱心網友回復:
如果要檢查列的值,有更有效的方法。最佳實踐是定義約束。當值存盤在表中時,則使用 FOREIGN KEY 約束;在其他情況下使用 CHECK 約束。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/381081.html
標籤:sql sql-server 查询语句 触发器
