各位大神:A表中ID为主键,当插入的数据违反主键时,把数据插入到B表,触发器怎么写!!

sunjun888888 2017-03-29 03:15:26
各位大神:A表中ID为主键,当插入的数据违反主键时,把数据插入到B表,触发器怎么写!!
...全文
306 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
JsLyn 2017-03-31
  • 打赏
  • 举报
回复
每次插入数据之前都查一次,是不是insert效率有点低呢。6楼的方法很不错,学习了
sunjun888888 2017-03-31
  • 打赏
  • 举报
回复
引用 9 楼 Haiwer 的回复:
这些代码能用吗?
可以用!!
昵称被占用了 2017-03-31
  • 打赏
  • 举报
回复
这些代码能用吗?
昵称被占用了 2017-03-31
  • 打赏
  • 举报
回复
主键检查在触发器之前,所以违反主键约束的语句提交都不会成功,也就不会触发触发器。
Ginnnnnnnn 2017-03-30
  • 打赏
  • 举报
回复
IF OBJECT_ID('tempdb..#Tmp1') IS NOT NULL
	DROP TABLE #Tmp1
CREATE TABLE #Tmp1(ID INT PRIMARY KEY,na NVARCHAR(50))

GO

IF OBJECT_ID('tempdb..#Tmp2') IS NOT NULL
	DROP TABLE #Tmp2
CREATE TABLE #Tmp2(ID INT,na NVARCHAR(50))
GO

CREATE PROCEDURE #TP (@ID int,@na nvarchar(50))
as
BEGIN TRY
BEGIN TRAN	
	INSERT INTO #Tmp1
	        ( ID, na )
	VALUES  ( @ID, -- ID - int
	          @na  -- na - nvarchar(50)
	          )
COMMIT TRAN
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() = 2627
	BEGIN 
		ROLLBACK ;
		INSERT INTO #Tmp2
		        ( ID, na )
		VALUES  ( @ID, -- ID - int
		          @na  -- na - nvarchar(50)
		          )
	END
END CATCH

GO

EXEC dbo.#TP @ID =1, -- int
    @na = N'a' -- nvarchar(50)
GO 2
SELECT * FROM #Tmp1
SELECT * FROM #Tmp2


sunjun888888 2017-03-30
  • 打赏
  • 举报
回复
引用 5 楼 sinat_28984567 的回复:
类似这种
ALTER TRIGGER dbo.tri_test
on A
INSTEAD OF INSERT 
as
begin
    IF(EXISTS(SELECT * FROM A WHERE ID = Inserted.ID))
	BEGIN
	INSERT INTO B(ID)VALUES(Inserted.Id)
	END
	ELSE
	BEGIN
	INSERT INTO A(ID)VALUES(Inserted.Id)
	END    
END


GO
谢谢你的答案 给了我思路,现贴出相关测试代码 create TRIGGER dbo.tri_test on tb_a instead of insert as begin declare @uuid varchar(100) select @uuid=uuid from inserted IF(EXISTS(SELECT uuid FROM tb_a a WHERE a.uuid = @uuid)) BEGIN INSERT INTO tb_b(uuid)VALUES(@uuid) END ELSE BEGIN INSERT INTO tb_a(uuid)VALUES(@uuid) END END
二月十六 版主 2017-03-29
  • 打赏
  • 举报
回复
类似这种
ALTER TRIGGER dbo.tri_test
on A
INSTEAD OF INSERT 
as
begin
    IF(EXISTS(SELECT * FROM A WHERE ID = Inserted.ID))
	BEGIN
	INSERT INTO B(ID)VALUES(Inserted.Id)
	END
	ELSE
	BEGIN
	INSERT INTO A(ID)VALUES(Inserted.Id)
	END    
END


GO
sunjun888888 2017-03-29
  • 打赏
  • 举报
回复
引用 2 楼 Mynameisamirror 的回复:
[quote=引用 1 楼 Mynameisamirror 的回复:] 你可以试着在执行中捕获异常,如果没有异常就正常插入到A表,有异常的话就插入到B表
http://www.cnblogs.com/OliverQin/p/4994717.html 你可以参与一个这个后面加个判断应该就行了[/quote] 我试试!!谢谢
sunjun888888 2017-03-29
  • 打赏
  • 举报
回复
引用 1 楼 Mynameisamirror 的回复:
你可以试着在执行中捕获异常,如果没有异常就正常插入到A表,有异常的话就插入到B表
try catch中怎么捕获主键异常啊,因为别的数据库异常不需要处理
㤁孞 2017-03-29
  • 打赏
  • 举报
回复
引用 1 楼 Mynameisamirror 的回复:
你可以试着在执行中捕获异常,如果没有异常就正常插入到A表,有异常的话就插入到B表
http://www.cnblogs.com/OliverQin/p/4994717.html 你可以参与一个这个后面加个判断应该就行了
㤁孞 2017-03-29
  • 打赏
  • 举报
回复
你可以试着在执行中捕获异常,如果没有异常就正常插入到A表,有异常的话就插入到B表

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧