sql觸發器判斷
㈠ mssql觸發器判斷語句
你的問題還是沒有描述清楚,那就先回答我的問題:
1,AID、BID、CID是不是按照序列方式遞增的,如:1,2,3, ............
2,AID、CID列的數據是不是提前已經寫好的?
3,從外部輸入的參數(新增數據)是不是只有一個參數被插入到USER表的BID列?
4,按照我的理解你是有兩個表是么,一個原表,一個新表?
㈡ 在Sql Server觸發器中判斷操作是Insert還是Update還是Delete
DECLARE
@IsInsert bit,
@IsUpdate bit,
@IsDelete bit
IF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS(SELECT 1 FROM deleted)
SET @IsInsert = 1
ELSE
SET @IsInsert = 0
IF EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
SET @IsUpdate = 1
ELSE
SET @IsUpdate = 0
IF NOT EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
SET @IsDelete = 1
ELSE
SET @IsDelete = 0
create trigger Update_Del on Table
for update,delete
as
if not exists(select 1 from inserted)
begin /*inserted表無記錄,是刪除*/
end
else
begin /*是更新*/ end
go
關鍵在於Inserted表
觸發器語句中使用了兩種特殊的表:deleted
表和 inserted 表。
Deleted
表用於存儲 DELETE 和 UPDATE 語句所影響的行的復本。在執行 DELETE 或 UPDATE 語句時,行從觸發器表中刪除,並傳輸到 deleted
表中。Deleted 表和觸發器表通常沒有相同的行。
Inserted
表用於存儲 INSERT 和 UPDATE 語句所影響的行的副本。在一個插入或更新事務處理中,新建行被同時添加到 inserted
表和觸發器表中。Inserted 表中的行是觸發器表中新行的副本。
1.插入操作(Insert)
Inserted表有數據,Deleted表無數據
2.刪除操作(Delete)
Inserted表無數據,Deleted表有數據
3.更新操作(Update)
Inserted表有數據(新數據),Deleted表有數據(舊數據)
㈢ mssql 觸發器中使用判斷
if (object_id('tr_insert', 'TR') is not null)
drop trigger tr_insert
GO
CREATE TRIGGER tr_insert
ON user
FOR insert
AS
DECLARE @AID, @BID, @CID INT;
SELECT @AID=AID,@BID=BID FROM INSERTED
IF EXISTS(SELECT 1 FROM user WHERE AID = @BID)
BEGIN
SELECT @CID=CID FROM user(UPDLOCK) WHERE AID = @BID
INSERT INTO user VALUES(@AID,@BID,@CID);
END
GO
㈣ SQL觸發器判斷總是為假
createtriggertri_InsertStudy
onStudyCourse_Table
forinsert--插入觸發
as
begin
--定義變數
declare@idvarchar(10),@StuIDint,@TeaIDint,@CourseIDint,@tempvarchar(10),@countSumint;
--變數賦值
select@id=StudyID,@StuID=StuID,@TeaID=TeaID,@CourseID=CourseIDfrominserted;
select@countSum=count(StudyID)fromStudyCourse_TablewhereStudyID=@id;
if@idisnull
begin
select@id=left(newid(),10);
select2;
insertintoStudyCourse_Table(StudyID,StuID,TeaID,CourseID)values(@id,@StuID,@TeaID,@CourseID)
end
else
begin
if@countSum>1
begin
select3;
select@temp=left(newid(),10);
updateStudyCourse_TablesetStudyID=@temp,StuID=@StuID,TeaID=@TeaID,@CourseID=CourseID
whereStudyID=@idandStuID=@StuIDandTeaID=@TeaIDand@CourseID=CourseID;
end
else
begin
select1;
end
end
end
/*
上面是修改過的
上面的觸發器存在問題,就是一次插入多條記錄時,肯定會有問題,因為inserted本身是個結果集,除非你能保證這個表的數據都是一條一條的插入,而不是批量插入
批量插入的話需要另外一種寫法。因為對你業務不了解,無法幫到你。
*/
㈤ 如何看sql 中的觸發器觸發了什麼
1)查看錶中的觸發器類型:
sp_helptrigger:返回對當前資料庫的指定表定義的 DML 觸發器的類型。sp_helptrigger 不能用於 DDL 觸發器。
示例: EXEC sp_helptrigger '表名'
2)查看觸發器的有關信息:
sp_help:報告有關資料庫對象(sys.sysobjects 兼容視圖中列出的所有對象)、用戶定義數據類型或某種數據類型的信息。
示例: EXEC sp_help '觸發器名'
3)顯示觸發器的定義:
sp_helptext:顯示規則、默認值、未加密的存儲過程、用戶定義函數、觸發器或視圖的文本。
示例: EXEC sp_helptext '觸發器名'
4)查看當前庫中所有的觸發器:
查詢腳本:SELECT * FROM Sysobjects WHERE xtype = 'TR'
5)查看當前庫中所有的觸發器和與之相對應的表:
查詢腳本:SELECT tb2.name AS tableName,tb1.name AS triggerName FROM Sysobjects tb1 JOIN Sysobjects tb2 ON tb1.parent_obj=tb2.id WHERE tb1.type='TR'