当前位置:数据库 > SQLServer >>

麻烦高手帮忙把一个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 时会将涉及表都锁住吗?求高手解答,本人不懂其中原理望详解

Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,