1、在触发器中可以和用户进行交互以及外在参数吗?怎样实现?
   比如:在删除一条记录时,让用户选择是否把记录中的某一部分保存到另一个表中;触发器根据程序运行时的一个参数,如FLAG(BOOLEAN)的值进行判断,进而选择执行某种操作。2、在写一个INSERT以及NSERTUPDATE触发器时,如何判断其中的某个字段是否是nil(字符型)或空值,并把另一个字段的值赋给该字段?

解决方案 »

  1.   

    2、在写一个INSERT以及NSERTUPDATE触发器时,如何判断其中的某个字段是否是nil(字符型)或空值,并把另一个字段的值赋给该字段?
    **以下是MSSQL的例子:
    create tigger ti_AAA on ....
    as
    update Table1
      set [某个字段]=i.[另一个字段]
    from inserted i
    where i.[Table1的主键名称]=Table1.[Table1的主键名称]
      

  2.   

    楼上兄弟可以再仔细给小弟说一下如何进行空值或空字符串的判断吗?Create trigger ti_aaa on ...
    asif Inserted.Field1=null or Inserted.Field1='' 
    update table1 set [Field1]=i.[Field3] from ...这样对吗?
      

  3.   

    1、在触发器中可以和用户进行交互以及外在参数吗?怎样实现?
       比如:在删除一条记录时,让用户选择是否把记录中的某一部分保存到另一个表中;触发器根据程序运行时的一个参数,如FLAG(BOOLEAN)的值进行判断,进而选择执行某种操作。不行。2、在写一个INSERT以及NSERTUPDATE触发器时,如何判断其中的某个字段是否是nil(字符型)或空值,并把另一个字段的值赋给该字段?if exists(select 1 from inserted where isnull(field1,'')='') 
      update table1 set [Field1]=i.[Field3] from ...
      

  4.   

    举例,同步两个不同数据库的两个表:CREATE TRIGGER 名1 ON dbo.tabMain
    FOR INSERT
    AS
    insert db2..tabSlave select * from insertedCREATE TRIGGER 名2 ON dbo.tabMain
    FOR update
    AS
    update db2..tabSlave set 列=aa.列 from inserted aa where aa.编号=db2..tabSlave.编号
    CREATE TRIGGER 名3 ON dbo.tabMain
    FOR delete
    AS
    delete db2..tabSlave where 编号 in (select 编号 from deleted)
      

  5.   

    多的这个触发器哪里不对呢?create trigger del4tabll1
    on table1
    for delete
    as
    update tabel2 set table2.field2=deleted.field5 from deleted where tabel2.field1=deleted.field1update tabel2 set table2.Field1=deleted.field4 from deleted where table2.Field1=deleted.Field1
      

  6.   

    create trigger del4tabll1
    on table1
    for delete
    as
    update tabel2 set field2=deleted.field5,Field1=deleted.field4 from deleted where tabel2.field1=deleted.field1你的语法没有问题,有什么异常吗?我这里合并了一下。
      

  7.   

    1、在触发器中可以和用户进行交互以及外在参数吗?怎样实现?
       比如:在删除一条记录时,让用户选择是否把记录中的某一部分保存到另一个表中;触发器根据程序运行时的一个参数,如FLAG(BOOLEAN)的值进行判断,进而选择执行某种操作。
    ----------------------------
    不行,但是你可以先写将前台的参数写到一个表中,在触发器中从这个表中取得前台的参数。2、在写一个INSERT以及NSERTUPDATE触发器时,如何判断其中的某个字段是否是nil(字符型)或空值,并把另一个字段的值赋给该字段?
    ---------------------------
    if exists(select 1 from inserted where field1 is null) 
      update table1 set [Field1]=i.[Field3] from ...
      

  8.   

    Create trigger 名 on tableName 
    For update
    As
        update t1 set ...
        if @@error <> 0 goto err
        update t2 set ...
        if @@error <> 0 goto err
        update t3 set ...
        if @@error <> 0 goto err
          ...
        return
    Err:
        rollback
        
      

  9.   

    如果设置了外键,就不能随便修改主键。
    可以设置级联更新,不用触发器。级联更新和级联删除:alter table mylocation
       add constraint fk_mylocation_myname foreign key(myname) references myname(name)
       on update cascade on delete cascade
    alter table 表2
       add constraint fk_mylocation_myname foreign key(字段1,字段2)references 表1(字段1,字段2)
       on update cascade on delete cascade
      

  10.   

    用MS-SQL 2000生成的数据库脚本,在DELPHI中用ADOCONNECT把这个脚本读入运行,会有下面几个问题:
      1、分隔语句GO不能通过ADOCONNECT执行,会提示出错信息;
      2、CREATE VIEW以及CREATE TRIGGER只能在首行运行,从而造成这个脚本在DELPHI下不能通过ADOCONNECT来读入运行。请问:有什么方法可以解决这两个问题,以使这个脚本可以正常运行?这样我们就可把在程序中所用到的SQL语句全部保存到一个表中,这样在SQL语句需要改动时,只要更改这个表就可以,同样可以避免在用户的磁盘中保存太多的SQL脚本。
      

  11.   

    你可以执行如下SQL语句来运行脚本:
    master..xp_cmdshell 'isql /S"服务器名" /U"用户名" /P"密码" /i"x:\xxx.sql"'
      

  12.   

    s:string;
    sqlfile:textfile;AssignFile(sqlfile, 'update.sql');
    Reset(sqlfile);
    while not eof(sqlfile) do
    begin
      Readln(sqlfile, s);
      sqltext:=s;
      while (not eof(sqlfile)) and (uppercase(trim(s))<>'GO') do
      begin
        Readln(sqlfile, s);
        if (uppercase(trim(s))<>'GO') then
          sqltext:=sqltext+' '+s;
      end;
      adoquery1.Close;
      adoquery1.SQL.Clear;
      adoquery1.SQL.Add(sqltext);
      adoquery1.ExecSQL;
    end;
    CloseFile(sqlfile);application.MessageBox('数据库升级完成!','提示',MB_OK+MB_ICONINFORMATION);//注:上述代码要求update.sql文件中语句无注释
      

  13.   

    你可以执行如下SQL语句来运行脚本:
    master..xp_cmdshell 'isql /S"服务器名" /U"用户名" /P"密码" /i"x:\xxx.sql"'

    master.dbo.xp_cmdshell 'osql -U 用户名 -P 密码 -i c:\***.sql'
      

  14.   

    To 马可:这样在程序执行时通过什么方法知道命令已经执行完了呢,并在程序执行过程中锁定键盘与鼠标?
    而且我在执行这个命令时会在最后出现OLE错误,提示“操作已过期”,是什么原因呢?(我的数据库脚本为140K)isql -S .\Yxmis -E -a 8192 -l 60 <E:\Yxmis\sql\CreateDb1.sqlTo 大力:老兄的方法我先试试再看
      

  15.   

    1:
    try
    {
      锁键盘和鼠标
      运行脚本
      打开键盘和鼠标
      显示完成
    }
    catch
    ...
    2:
    对于超时,如下处理:1:企业管理器->服务器->属性->连接->查询超时(改为0或一个较大的数)
    2:ADO的连接超时属性connectiontimeout 设大点.
    3:ADO的CommandTimeout设大点
      

  16.   

    请马可到:http://expert.csdn.net/Expert/topic/2406/2406819.xml?temp=.7752039请大力到:http://expert.csdn.net/Expert/topic/2406/2406818.xml?temp=.9781458