create global temporary table system.TMP20101108
(
serial        NUMBER(10) not null,
  zzcj   VARCHAR2(20),
  zzjhrq VARCHAR2(20)
 
)--建立临时表
1. CREATE SEQUENCE SYSTEM.seq_TMP20101108     
    MINVALUE 1
     NOMAXVALUE
     START WITH 1 
     INCREMENT BY 1
     NOCYCLE
     NOCACHE
2 alter table SYSTEM.TMP20101108 ADD(PRIMARY KEY(serial))
3 create or replace trigger SYSTEM.tg_TMP20101108 
before insert on SYSTEM.TMP20101108 for each row when (new.serial is null)
begin
  select seq_TMP20101108.nextval into :new.serial from dual;
end;  
这是一种方法 不过比较麻烦,因为我从sql server 2000导到oracle的数据,每建立一个都要检索出最大值 
select max(serial) from SYSTEM.TMP20101108 
然后把最大值赋值到 START WITH  后面后来我在网上看到一个这种方式
  CREATE OR REPLACE TRIGGER system.TR1 
  BEFORE INSERT ON system.TMP20101108 FOR EACH ROW 
  declare com_num NUMBER;
  BEGIN
    SELECT MAX(serial) INTO :com_num FROM SYSTEM.TMP20101108; 
    NEW.serial:=com_num+1;
  END TR1;
可是问题出现了 根本在企业管理器中编译不过去,
提示我
ora-00942 表或视图不存在
你没有足够的权限执行该操作。
你必须具备适当的权限编辑删除数据库对象或者不属于您的方案的对象这是什么问题啊 

解决方案 »

  1.   

    create sequence TC_SQ_SFB
    minvalue 1
    maxvalue 999999999999999999999999999
    start with 1
    increment by 1
    cache 20;
      

  2.   

    可能是你该用户没有对表TMP20101108的操作权限,你先赋权限后再做呢
    CREATE OR REPLACE TRIGGER system.TR1  
    BEFORE INSERT ON system.TMP20101108 
    FOR EACH ROW  
    DECLARE
          com_num NUMBER;
    BEGIN
      SELECT MAX(serial) INTO com_num FROM SYSTEM.TMP20101108;  --com_num 变量前面不要冒号
      :NEW.serial:=com_num+1; --这里关键字new要用冒号 :new.serial
    END TR1;
      

  3.   

    这样的maxvalue 就可以直接nomaxvalue吧
      

  4.   

    我觉得你的说法可以 可是我在pl/sql里面可以查询system.TMP20101108 
    这个表啊 我还需要赋予什么权限啊 我用的用户是system 这个应该具备所有权限吧 
      

  5.   

    你的表TMP20101108是哪个账户下创建的?登录那个用户给system授权再创建同义词试试
      

  6.   

    我说了 用序列是可以的 不过我从sql server 2000导到oracle的数据库 里面好多数据 我必须
    select max(serial) from table 查询出来最大的值 然后手工的添加到 start with 后面去,
    start with 不是从哪个开始的意思吗 我只有查询到最大的值 一个一个加1才不会重复 因为serial是主键不可以重复的
      

  7.   

    我在pl/sql 里面用system登陆的 连接为sysdba 创建的
    create global temporary table system.TMP20101108
    (
    serial        NUMBER(10) not null,
      zzcj   VARCHAR2(20),
      zzjhrq VARCHAR2(20)
     
    )
    on commit delete rows;
    然后用system 登陆的企业管理器 查看创建的触发器 也是sysdba 角色登陆的
      

  8.   

    搞定了 谢谢gelyon
    问题出在我把脚本写错了 按你给的那种方式写就没问题了 我该有:的地方没有 不该有的地方就有了
      

  9.   


    --那你可不可以这样?动态创建你的序列
    CREATE OR REPLACE TRIGGER system.TR1  
    BEFORE INSERT ON system.TMP20101108 
    FOR EACH ROW  
    DECLARE
          com_num NUMBER;
    BEGIN
      SELECT MAX(serial) INTO com_num FROM SYSTEM.TMP20101108;  
      execute immediate 'CREATE  OR REPLACE SEQUENCE SYSTEM.seq_TMP20101108  MINVALUE 1 NOMAXVALUE START WITH ||col_num||'  INCREMENT BY 1   NOCYCLE  NOCACHE';
      select seq_TMP20101108.nextval into :new.serial from dual;
    END TR1;
      

  10.   

    gelyon 你人真好啊 问题已经解决了 是我的原因网上是这么写的
    CREATE OR REPLACE TRIGGER TR1 BEFORE INSERT ON temp_table FOR EACH ROWdeclare com_num NUMBER;BEGINSELECT MAX(ID) INTO COM_NUM FROM TEMP_TABLE; :NEW.ID:=COM_NUM+1;END TR1;
    我给乱改一通 你那么写
    CREATE OR REPLACE TRIGGER system.TR1  
    BEFORE INSERT ON system.TMP20101108 
    FOR EACH ROW  
    DECLARE
          com_num NUMBER;
    BEGIN
      SELECT MAX(serial) INTO com_num FROM SYSTEM.TMP20101108;  --com_num 变量前面不要冒号
      :NEW.serial:=com_num+1; --这里关键字new要用冒号 :new.serial
    END TR1;是没有问题的 也不提示我错误了 ,也不用动态创建序列了 
    我觉得第二种创建触发器的方法 比创建序列那个简单明了的 难道会有什么隐患吗
      

  11.   

    oracle序列本身就是自增的,不会重复的!
      

  12.   

    只增长:序列+触发器SQLSERVER就没这么麻烦