34,590
社区成员
发帖
与我相关
我的任务
分享
USE tempdb
GO
IF OBJECT_ID('A') IS NOT NULL DROP TABLE A
IF OBJECT_ID('B') IS NOT NULL DROP TABLE B
GO
CREATE TABLE A(
aId INT PRIMARY KEY,
aname NVARCHAR(10)
)
GO
CREATE TABLE B(
id INT IDENTITY(1,1) PRIMARY KEY,
aId INT NOT NULL,
bname NVARCHAR(10)
)
GO
SET NOCOUNT ON
INSERT INTO B (aId,bName) VALUES (1,'bb');
----- 以上为测试表及测试数据 -------
GO
--------- 创建存储过程 -------------
IF OBJECT_ID('Proc_InsertIntoA') IS NOT NULL
DROP PROC Proc_InsertIntoA
GO
-- =============================================
-- Author: ye
-- Create date: 2018-12-19
-- Description: 插入到 A 表,如果不满足条件则不插入
-- =============================================
CREATE PROCEDURE Proc_InsertIntoA
@aId INT,
@aname NVARCHAR(10)
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS(SELECT 1 FROM b WHERE b.aId=@aId)
BEGIN
RAISERROR('B 表不存在插入记录的对应 aId,则不允许插入',16,1)
RETURN;
END
INSERT INTO A(aId,aname) VALUES (@aId,@aname);
END
GO
--测试插入
--B中存在 aId=1 的记录,允许
EXEC Proc_InsertIntoA @aId=1, @aname='a1';
GO
--B中不存在 aId=2 记录,不允许
EXEC Proc_InsertIntoA @aId=2, @aname='a2';
/*
消息 50000,级别 16,状态 1,过程 Proc_InsertIntoA,行 14 [批起始行 52]
B 表不存在插入记录的对应 aId,则不允许插入
*/
--检查 A 表插入了哪些记录,符合预期
SELECT * FROM A
/*
aId aname
----------- ----------
1 a1
*/
你用存储过程, 仿照我上面的写法就是了。
但是, 选择用存储过程而不用触发器, 则你只能用存储过程来插入, 用语句就会有问题了。
这个要在使用时比较注意。,USE tempdb
GO
IF OBJECT_ID('trig_A_I') IS NOT NULL DROP TRIGGER trig_A_I
IF OBJECT_ID('A') IS NOT NULL DROP TABLE A
IF OBJECT_ID('B') IS NOT NULL DROP TABLE B
GO
CREATE TABLE A(
aId INT PRIMARY KEY,
aname NVARCHAR(10)
)
GO
CREATE TABLE B(
id INT IDENTITY(1,1) PRIMARY KEY,
aId INT NOT NULL,
bname NVARCHAR(10)
)
GO
SET NOCOUNT ON
INSERT INTO B (aId,bName) VALUES (1,'bb');
GO
-- =============================================
-- Author: ye
-- Create date: 2018-12-19
-- Description: 如果 B 表不存在插入记录的对应 aId,则不允许插入。
-- =============================================
CREATE TRIGGER dbo.trig_A_I
ON dbo.A
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS(SELECT 1 FROM INSERTED AS x LEFT JOIN b AS y ON x.aId=y.aId WHERE y.aId IS NULL)
BEGIN
RAISERROR('B 表不存在插入记录的对应 aId,则不允许插入',16,1)
ROLLBACK TRAN;
END
END
GO
INSERT INTO A(aid,aname) VALUES(1,'a1');
GO
INSERT INTO A(aid,aname) VALUES(2,'a2');
/*
消息 50000,级别 16,状态 1,过程 trig_A_I,行 14 [批起始行 42]
B 表不存在插入记录的对应 aId,则不允许插入
消息 3609,级别 16,状态 1,第 43 行
事务在触发器中结束。批处理已中止。
*/
SELECT * FROM A
/*
aId aname
1 a1
*/
类似这样处理就好了