1、在触发器中可以和用户进行交互以及外在参数吗?怎样实现?
比如:在删除一条记录时,让用户选择是否把记录中的某一部分保存到另一个表中;触发器根据程序运行时的一个参数,如FLAG(BOOLEAN)的值进行判断,进而选择执行某种操作。2、在写一个INSERT以及NSERTUPDATE触发器时,如何判断其中的某个字段是否是nil(字符型)或空值,并把另一个字段的值赋给该字段?
比如:在删除一条记录时,让用户选择是否把记录中的某一部分保存到另一个表中;触发器根据程序运行时的一个参数,如FLAG(BOOLEAN)的值进行判断,进而选择执行某种操作。2、在写一个INSERT以及NSERTUPDATE触发器时,如何判断其中的某个字段是否是nil(字符型)或空值,并把另一个字段的值赋给该字段?
解决方案 »
- delphi多线程问题!!
- 如何在前台编程实现这个功能呀?(如果后台数据库存在"AAA"的数据库,那么就弹出对话框"后台数据库存在"AAA"的数据库!")
- 500 求三层完整例子。
- Update语句的咄咄怪事!!!
- 紧急求助,edit输入dbgrid的问题
- 有一个疑问一直困扰着我,大家帮我看看(急啊!!)
- 怎么样把另外一个窗口显示在主窗口的panel里面!
- 我怎么知道并取得TDATASET中被修改的字段以及修改前后的值?
- 对oracle的Blob类型的字段作更新,出现的问题,请高手解答。
- 关于串口问题:我用Ms的Mscomm控件来一次传送一个字符串,字符串有118个字符,范围为0~255,经常会在中间出错
- Paintbox1.Canvas.LineTo(x,y)画曲线的问题,在线等待
- 有做过财务软件的高手哇,怎样把后坠为lst的报表文件导入excel?
**以下是MSSQL的例子:
create tigger ti_AAA on ....
as
update Table1
set [某个字段]=i.[另一个字段]
from inserted i
where i.[Table1的主键名称]=Table1.[Table1的主键名称]
asif Inserted.Field1=null or Inserted.Field1=''
update table1 set [Field1]=i.[Field3] from ...这样对吗?
比如:在删除一条记录时,让用户选择是否把记录中的某一部分保存到另一个表中;触发器根据程序运行时的一个参数,如FLAG(BOOLEAN)的值进行判断,进而选择执行某种操作。不行。2、在写一个INSERT以及NSERTUPDATE触发器时,如何判断其中的某个字段是否是nil(字符型)或空值,并把另一个字段的值赋给该字段?if exists(select 1 from inserted where isnull(field1,'')='')
update table1 set [Field1]=i.[Field3] from ...
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)
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
on table1
for delete
as
update tabel2 set field2=deleted.field5,Field1=deleted.field4 from deleted where tabel2.field1=deleted.field1你的语法没有问题,有什么异常吗?我这里合并了一下。
比如:在删除一条记录时,让用户选择是否把记录中的某一部分保存到另一个表中;触发器根据程序运行时的一个参数,如FLAG(BOOLEAN)的值进行判断,进而选择执行某种操作。
----------------------------
不行,但是你可以先写将前台的参数写到一个表中,在触发器中从这个表中取得前台的参数。2、在写一个INSERT以及NSERTUPDATE触发器时,如何判断其中的某个字段是否是nil(字符型)或空值,并把另一个字段的值赋给该字段?
---------------------------
if exists(select 1 from inserted where field1 is null)
update table1 set [Field1]=i.[Field3] from ...
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
可以设置级联更新,不用触发器。级联更新和级联删除: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
1、分隔语句GO不能通过ADOCONNECT执行,会提示出错信息;
2、CREATE VIEW以及CREATE TRIGGER只能在首行运行,从而造成这个脚本在DELPHI下不能通过ADOCONNECT来读入运行。请问:有什么方法可以解决这两个问题,以使这个脚本可以正常运行?这样我们就可把在程序中所用到的SQL语句全部保存到一个表中,这样在SQL语句需要改动时,只要更改这个表就可以,同样可以避免在用户的磁盘中保存太多的SQL脚本。
master..xp_cmdshell 'isql /S"服务器名" /U"用户名" /P"密码" /i"x:\xxx.sql"'
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文件中语句无注释
master..xp_cmdshell 'isql /S"服务器名" /U"用户名" /P"密码" /i"x:\xxx.sql"'
或
master.dbo.xp_cmdshell 'osql -U 用户名 -P 密码 -i c:\***.sql'
而且我在执行这个命令时会在最后出现OLE错误,提示“操作已过期”,是什么原因呢?(我的数据库脚本为140K)isql -S .\Yxmis -E -a 8192 -l 60 <E:\Yxmis\sql\CreateDb1.sqlTo 大力:老兄的方法我先试试再看
try
{
锁键盘和鼠标
运行脚本
打开键盘和鼠标
显示完成
}
catch
...
2:
对于超时,如下处理:1:企业管理器->服务器->属性->连接->查询超时(改为0或一个较大的数)
2:ADO的连接超时属性connectiontimeout 设大点.
3:ADO的CommandTimeout设大点