以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [讨论]_identify 的问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=116288)

--  作者:积水成渊
--  发布时间:2018/3/22 11:38:00
--  [讨论]_identify 的问题
做了一个窗口,窗口中表的类型为SQLtable,发现在界面上删除行时,数据库中的数据并没有删除掉,后面通过跟踪代码发现,界面上删除数据是通过_identify来删除数据库底层的数据的,但是由于界面上获取的_identify跟数据库中药删除数据的_identify不一致,导致不能将数据库底层的数据删除掉,甚至更严重的是会错误的删除数据库底层的数据,请问有什么办法可以让界面的_identify与数据库底层的_identify一致,从而实现精确的删除数据库底层的数据,由于_identify的不一致,会导致多人操作时数据保存混乱,求老师们提供一个好的解决方案
[此贴子已经被作者于2018/3/22 11:39:27编辑过]

--  作者:有点甜
--  发布时间:2018/3/22 12:02:00
--  

1、你自己编写代码删除数据的?如果使用Tables("xxx").Save的方式保存,数据肯定是没问题的。

 

2、如果自己编写代码删除数据。先理解这个:新增的行_Identify是临时的,保存之后_Identify才会生出唯一的值。

 

    你可以先保存行,再引用_Identify列的值,这样就没问题。


--  作者:积水成渊
--  发布时间:2018/3/26 15:19:00
--  
是按照先保存,然后获取_Identify的方法处理的,我发现问题所在,我在数据库表里做了触发器,触发器的功能是当表中数据发生修改或者删除数据的时候,触发器会将
修改或者删除的数据插入到另外一张表中,像这种写了触发器的表,如果获取数据库底层的_Identify
[此贴子已经被作者于2018/3/26 15:42:05编辑过]

--  作者:有点甜
--  发布时间:2018/3/26 16:06:00
--  

你触发器处理什么情况的?更新、删除?还是新增的?

 

更新或者删除情况,_Identify的列肯定是正确的。请具体一点你的问题。


--  作者:积水成渊
--  发布时间:2018/3/28 10:39:00
--  
老师我的触发器的内容是这样写的:
CREATE trigger [dbo].[trg_用户管理设置新增] on [dbo].[SYS_Users] for insert,delete
as
--新增用户数据 触发器执行新增角色管理表和表权限设置表
--select top 1 * into #inserted fr om SYS_Users 
--select * fr om SYS_RolePower
--select * fr om SYS_TablePower
--select * fr om SYS_Ribbon
--将新增的用户信息新增至角色管理中
--用户信息表的角色字段保存的是用户ID,用户ID是唯一值
delete fr om SYS_RolePower where UserRole in (select UserRole fr om deleted)
insert into SYS_RolePower(Unit,UserRole,[Group],_Locked,UserType,NavBar)
select Unit,UserRole,[Group],0,UserType,\'\' 
fr om inserted where UserRole not in (select UserRole fr om SYS_RolePower)

delete fr om SYS_TablePower where UserRole in (select UserRole fr om deleted)
insert into SYS_TablePower(UserRole,ViewName,Visible,Edit,Options,AddRow,DelRow,LockRow,UnLockRow,Perform,_Locked,Copy,Import,Export,查询)
select a.UserRole,b.ItemName,0,0,\'\',0,0,0,0,\'\',0,0,0,0,0 fr om inserted a,SYS_Ribbon b 
where b.[Enable] = 1 and b.Parent <> \'NavBar\' and b.[Type] = \'MenuItem\' and a.UserRole not in (select distinct UserRole fr om SYS_TablePower where UserRole is not null)
order by b._SortKey asc

GO

--  作者:有点甜
--  发布时间:2018/3/28 11:04:00
--  

方法一:直接获取, select _Identify from inserted

 

方法二:使用全局变量 @@identity

 

方法三:使用函数 SCOPE_IDENTITY()


--  作者:积水成渊
--  发布时间:2018/3/28 11:25:00
--  
感谢提供的方法,我现在去试下
--  作者:积水成渊
--  发布时间:2018/3/28 12:07:00
--  
老师,没有测试出来,可以给我讲解一下方法三如何使用吗,是这么修改的吗:
老师我的触发器的内容是这样写的:
CREATE trigger [dbo].[trg_用户管理设置新增] on [dbo].[SYS_Users] for insert,delete
as
--新增用户数据 触发器执行新增角色管理表和表权限设置表
--select top 1 * into #inserted fr om SYS_Users 
--select * fr om SYS_RolePower
--select * fr om SYS_TablePower
--select * fr om SYS_Ribbon
--将新增的用户信息新增至角色管理中
--用户信息表的角色字段保存的是用户ID,用户ID是唯一值
delete fr om SYS_RolePower where UserRole in (select UserRole fr om deleted)
insert into SYS_RolePower(Unit,UserRole,[Group],_Locked,UserType,NavBar)
select Unit,UserRole,[Group],0,UserType,\'\' 
fr om inserted where UserRole not in (select UserRole fr om SYS_RolePower)

delete fr om SYS_TablePower where UserRole in (select UserRole fr om deleted)
insert into SYS_TablePower(UserRole,ViewName,Visible,Edit,Options,AddRow,DelRow,LockRow,UnLockRow,Perform,_Locked,Copy,Import,Export,查询)
select a.UserRole,b.ItemName,0,0,\'\',0,0,0,0,\'\',0,0,0,0,0 fr om inserted a,SYS_Ribbon b 
where b.[Enable] = 1 and b.Parent <> \'NavBar\' and b.[Type] = \'MenuItem\' and a.UserRole not in (select distinct UserRole fr om SYS_TablePower where UserRole is not null)
order by b._SortKey asc

--新添加代码
se lect SCOPE_IDENTITY() as   ID   fr om inserted

GO

--  作者:有点甜
--  发布时间:2018/3/28 12:16:00
--  

1、你什么时候需要使用 _Identify 列的值?

 

2、你需要这个值做什么?你要加到哪句代码去?


--  作者:积水成渊
--  发布时间:2018/3/28 12:27:00
--  
我是多人操作用户这张表,当每次新增完行点保存时需要用到数据库底层的_Identify,修改数据后,点保存的时候也需要用到_Identify