现在的位置: 首页 > 综合 > 正文

在论坛中出现的各种疑难问题:各种问题

2014年04月05日 ⁄ 综合 ⁄ 共 1677字 ⁄ 字号 评论关闭

1、sql2008碰到一个奇怪问题,大家有没有碰到过啊
http://bbs.csdn.net/topics/390692705

同一个存储过程,从sqlserver profiler里监视,看到的语句执行时间是20秒以上,从监视器里把语句copy到查询分析器里执行,也就一两秒钟就能执行完毕。
请问这是神马情况,试了好多次都是这样。
这样直接导致程序超时异常,有人碰到过这种情况吗?

不是拷贝存储过程里的语句,是拷贝的profiler里监视到的语句

是profile里监视到得程序调用的,duration是23秒多。

楼主的解决方法:找到问题了,sql日志太大引起的,清理一下日志,查询耗时都变成1秒不到了,不过也不算大啊,才900多M...


2、SQL锁问题

我有一个需求。数据库中有一个职工表,其中有个int型的ID字段。在程序中添加员工时,要点击‘检测ID’按钮获取数据中最大的ID并加一形成最新的ID。

列子:假设数据库中职工表的最大ID为135,那么我点击‘检测ID’按钮之后得到的新ID就是136。
    
但是问题就出现了,假设多个人同时点击'检测ID'按钮,获得的最新ID都是一样的。
列子:假设数据库中职工表的最大ID为135,那么多人同时点击‘检测ID’按钮之后得到的新ID都是136。

我想要的效果是在甲点击‘检测ID’获取到新ID之后,后面的用户就无法获取到最新ID。要等甲完成新增操作之后,后面的用户才能获取到最新的ID。

请问能否用SQL中的锁之类的方法解决这个问题,或者说其他什么方法。


我的建议:

create table tb_id(tb_name varchar(100),currval int,status int)

insert into tb_id
values('xxx',1,0)
go


begin tran

declare @currval int


update tb_id
set status = 1,
    @currval = currval+1,
    currval = currval + 1
where status = 0 and tb_name = 'xxx'


--select @currval

--使用id
insert into xxx
values(@currval)

update tb_id
set status = 0,
where status = 1 and tb_name = 'xxx'

commit tran

3、SQL2005中的权限查询问题

http://bbs.csdn.net/topics/390696018

SQL2005中怎么用SQL语句或者存储过程查询到:

某个用户名对某数据库中的某表中的某字段的增删改查及其他的所有权限?

我的方法:

--1.创建登陆
create login wcc
with password = '123'


--2.模拟登陆wcc

declare @login nvarchar(100)

set @login = 'wcc'

execute as login=@login


--3.查询权限,发现没有任何权限
select *  
from sys.fn_my_permissions('spgj_yjm',--安全对象的名称  
                           'object')    --要列出权限的安全对象类 
where subentity_name <>''
go


--4.回到当前的登录名,也就是sa用户
revert
go

--5.返回了对表spgj_yjm的各个列的权限
select *  
from sys.fn_my_permissions('spgj_yjm',--安全对象的名称  
                           'object')    --要列出权限的安全对象类 
where subentity_name <>''
/*
entity_name	subentity_name	permission_name
spgj_yjm	ydh	SELECT
spgj_yjm	yjm	SELECT
spgj_yjm	flag	SELECT
spgj_yjm	ydh	UPDATE
spgj_yjm	yjm	UPDATE
spgj_yjm	flag	UPDATE
spgj_yjm	ydh	REFERENCES
spgj_yjm	yjm	REFERENCES
spgj_yjm	flag	REFERENCES
*/

抱歉!评论已关闭.