Sql server 使用替代SQL触发器插入或更新视图
我想给视图写一个触发器,Sql server 使用替代SQL触发器插入或更新视图,sql-server,tsql,triggers,Sql Server,Tsql,Triggers,我想给视图写一个触发器,VW_BANKBRANCH: 如果插入的行包含表中存在的bankcode,则更新 bName包含插入数据的银行表列 否则,将行插入银行表以反映新信息 但是我的扳机坏了 我的桌子 CREATE TABLE bank( code VARCHAR(30) PRIMARY KEY, bName VARCHAR(50) ); CREATE TABLE branch( brNum INT PRIMARY KEY, brName VARCHAR(50), br
VW_BANKBRANCH
:
- 如果插入的行包含表中存在的
,则更新bankcode
包含插入数据的银行表列bName
- 否则,将行插入银行表以反映新信息
CREATE TABLE bank(
code VARCHAR(30) PRIMARY KEY,
bName VARCHAR(50)
);
CREATE TABLE branch(
brNum INT PRIMARY KEY,
brName VARCHAR(50),
braddress VARCHAR(50),
bcode VARCHAR(30) REFERENCES bank(code)
);
CREATE VIEW VW_BANKBRANCH
AS
SELECT code,bname,brnum,brName
FROM bank ,branch
WHERE code=bcode
我的触发器
CREATE TRIGGER tr_VW_BANKBRANCH_INSERT ON VW_BANKBRANCH
INSTEAD OF INSERT
AS
BEGIN
DECLARE @insertedBankCode INT
@insertedbname varchar
@insertedbrnum int
@insertedbrName varchar
SELECT @insertedBankCode = code
FROM INSERTED
IF(@insertedBankCode=code)
SET code=@insertedBankCode
bname=@insertedbname
brnum=@insertedbrnum
brName=@insertedbrName
ELSE
insert(code,bname,brnum,brName)
END
我在下面的视图中修改了instead of触发器-我假设您希望相应地向上插入银行和分行(尽管请注意,分行地址当前不在视图中) 也就是说,我会小心(ab)在
INSERT
上使用一个代替触发器来进行升级-这对读者来说可能不是完全直观的
另外,请记住,插入的
伪表可能包含一组行,因此需要相应地调整为基于集合的方法
CREATE TRIGGER tr_VW_BANKBRANCH_INSERT ON VW_BANKBRANCH
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE b
SET bname = i.bname
FROM bank b
INNER JOIN inserted i
ON i.code = b.code;
UPDATE br
SET
br.brName = i.brName,
br.braddress = NULL -- TODO add this to the view
FROM branch br
INNER JOIN inserted i
ON br.bcode = i.code
AND br.brNum = i.brNum;
INSERT INTO bank(code, bname)
SELECT code, bname
FROM inserted i
WHERE NOT EXISTS
(SELECT 1 FROM bank b WHERE b.code = i.Code);
INSERT INTO Branch(brNum, brName, braddress, bcode)
SELECT brNum, brName, NULL, code
FROM inserted i
WHERE NOT EXISTS
(SELECT 1
FROM branch br
WHERE br.bcode = i.Code AND br.brNum = i.brNum);
END;
GO
-我还调整了视图以使用连接,而不是旧式的WHERE连接
如果您使用的是SQLServer2008或更高版本,您也可以使用它,而不是单独的插入和更新。到底是什么不起作用?根本跑不动?它不会产生预期的结果吗?它不会编译吗。。。?是的,它不会产生预期的结果很高兴我能帮忙!我希望你不介意-我改变了你问题的标题-这可能会在将来帮助其他人。