麻烦高手帮忙把一个sqlserver的触发器改成oracle的,谢谢了。。。sql脚本如下:
CREATE TRIGGER [dbo].[INSERT_UPDATE_OU_USERS]
ON [dbo].[OU_USERS]
FOR INSERT, UPDATE
AS
BEGIN
DECLARE @@ParentID AS NVARCHAR(36)
DECLARE @@ObjName AS NVARCHAR(255)
DECLARE @@AllPathName AS NVARCHAR(512)
DECLARE @@SysDis1 AS NVARCHAR(255)
DECLARE @@SysDis2 AS NVARCHAR(255)
DECLARE @@RowNum AS INT
SELECT @@ParentID = [PARENT_GUID], @@objName = OBJ_NAME, @@SysDis1 = OUSYSDISTINCT1, @@SysDis2 = OUSYSDISTINCT2, @@AllPathName=ALL_PATH_NAME FROM INSERTED
/*
SELECT @@RowNum=COUNT(*) FROM OU_USERS WHERE OUSYSDISTINCT1 IS NOT NULL AND OUSYSDISTINCT1 = @@SysDis1
IF @@RowNum > 1
BEGIN
RAISERROR('对不起,系统中已经存在了一个“备用字段1”为“%s”的数据项!', 16, 1, @@SysDis1)
END
SELECT @@RowNum=COUNT(*) FROM OU_USERS WHERE OUSYSDISTINCT2 IS NOT NULL AND OUSYSDISTINCT2 = @@SysDis2
IF @@RowNum > 1
BEGIN
RAISERROR('对不起,系统中已经存在了一个“备用字段2”为“%s”的数据项!', 16, 1, @@SysDis2)
END
*/
IF @@ObjName <> RIGHT(@@AllPathName, LEN(@@ObjName))
BEGIN
RAISERROR('对不起,新增加“人员”的“系统位置(%s)”与“对象名称(%s)”不符!', 16, 1, @@AllPathName, @@ObjName)
END
SELECT @@RowNum=COUNT(*)
FROM ( SELECT GUID, ALL_PATH_NAME FROM GROUPS WHERE ALL_PATH_NAME = @@AllPathName
UNION
SELECT GUID, ALL_PATH_NAME FROM ORGANIZATIONS WHERE ALL_PATH_NAME = @@AllPathName AND [GUID] <> @@ParentID
UNION
SELECT USER_GUID, ALL_PATH_NAME FROM OU_USERS WHERE ALL_PATH_NAME = @@AllPathName
) T
IF @@RowNum > 1
BEGIN
RAISERROR('对不起,系统中已经存在"系统位置"--“%s”,请换一个新的对象名称!', 16, 1, @@AllPathName)
END
END
GO
追问:SELECT PARENT_GUID,OBJ_NAME,OUSYSDISTINCT1,OUSYSDISTINCT2,ALL_PATH_NAME INTO PARENTID,OBJNAME,SYSDIS1,SYSDIS2,ALLPATHNAME FROM INSERTED;
这句 最后那个FROM INSERTED,oracle里好像没有inserted这个表啊 这是sqlserver的触发器里才有的,怎么办啊?这个是个INSERT OR UPDATE 触发器 所以在sqlserver里 inserted表存的就是插入或变更的记录
比如你是insert into OU_USERS (Column1,Column2,Column3)values('aaa','bbb','ccc') 执行这句话触发的这个触发器的话 inserted表存的就是这条记录。这个触发器是无论你对表OU_USERS进行插入操作还是更新操作都会触发的 无论是insert还是update操作,这个inserted表里存的都是新纪录,就是插入进来的或者是刚更新的记录,与之对应的还有个deleted表 如果是insert操作那么deleted表里就没有数据,如果是update操作,deleted表里存的就是变更前的记录。
总之,inserted表和deleted表是sqlserver触发器里特有的两个临时表,
inserted存改变后的记录
deleted存改变前的记录没用过诶,这个可以帮我把sqlserver直接转成oracle么?给个下载地址呗。
答案:CREATE OR REPLACE TRIGGER INSERT_UPDATE_OU_USERS
AFTER INSERT OR UPDATE
ON OU_USERS
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE
PARENTID VARCHAR2(36);
OBJNAME VARCHAR2(255);
ALLPATHNAME VARCHAR2(512);
SYSDIS1 VARCHAR2(255);
SYSDIS2 VARCHAR2(255);
ROWNUM NUMBER;
BEGIN
SELECT PARENT_GUID,OBJ_NAME,OUSYSDISTINCT1,OUSYSDISTINCT2,ALL_PATH_NAME INTO PARENTID,OBJNAME,SYSDIS1,SYSDIS2,ALLPATHNAME FROM INSERTED;
IF OBJNAME <> RIGHT(ALLPATHNAME, LEN(OBJNAME) THEN
RAISE_APPLICATION_ERROR(-20001,'对不起,新增加“人员”的“系统位置'||ALLPATHNAME||'”与“对象名称'||OBJNAME||'”不符!');
END IF;
SELECT COUNT(*) INTO ROWNUM
FROM ( SELECT GUID, ALL_PATH_NAME FROM GROUPS WHERE ALL_PATH_NAME = ALLPATHNAME
UNION
SELECT GUID, ALL_PATH_NAME FROM ORGANIZATIONS WHERE ALL_PATH_NAME = ALLPATHNAME AND [GUID] <> PARENTID
UNION
SELECT USER_GUID, ALL_PATH_NAME FROM OU_USERS WHERE ALL_PATH_NAME = ALLPATHNAME
) T;
IF ROWNUM > 1 THEN
RAISE_APPLICATION_ERROR(-20001,'对不起,系统中已经存在"系统位置"--“'||ALLPATHNAME||'”,请换一个新的对象名称!');
END IF;
END;
其他:期待高手! 额 没用过toad for oracle么?
建议用TOAD来改和测试
上一个:推荐几个好的sqlserver学习网站
下一个:sqlserver使用 cte 时会将涉及表都锁住吗?求高手解答,本人不懂其中原理望详解