【发布时间】:2011-05-08 03:31:23
【问题描述】:
我已将两个 SQL Server 2005 db(DB1 和 DB2)恢复到运行 SQL Server 2008 R2 的新机器中。
所有对象都归 dbo 所有
我有一个存储过程DB1.dbo.mp_SPTest。我已将执行权限授予SQLUser1。
CREATE PROCEDURE mp_SPTest
AS
SELECT DB2.dbo.mf_UserHasAccess("BasicUser", "bob")
mp_SPTest 在 DB2 DB2.dbo.mf_UserHasAccess() 中调用一个标量函数,该函数检查传递的用户名是否是 SQL 角色的成员.....
CREATE FUNCTION [dbo].[mf_UserHasAccess] (@RoleName varchar(50), @UserName varchar(128))
RETURNS bit
AS
BEGIN
DECLARE @Result bit
SELECT @Result = 1
WHERE @RoleName IN (
SELECT CASE
WHEN (usg.uid is null) THEN 'public'
ELSE usg.name
END AS RoleName
FROM dbo.sysusers usu
LEFT OUTER JOIN (dbo.sysmembers mem
INNER JOIN dbo.sysusers usg
ON mem.groupuid = usg.uid)
ON usu.uid = mem.memberuid
LEFT OUTER JOIN master.dbo.syslogins lo
ON usu.sid = lo.sid
WHERE
(usu.islogin = 1 AND usu.isaliased = 0 AND usu.hasdbaccess = 1)
AND (usg.issqlrole = 1 OR usg.uid is NULL)
AND usu.name = @UserName)
IF @Result <> 1
BEGIN
SET @Result = 0
END
RETURN @Result
END
当我以“SQLUser1”运行此过程时,它告诉我 bob 不是 BasicUser 的成员,但当我以“sa”运行它时,它告诉我他是成员。
据我了解...因为过程和函数都归 dbo 所有,所以这是 test2 db 中的函数将运行的上下文,因此它应该可以访问相同的用户和登录表。
这在 SQL Server 2005 上运行良好,无法弄清楚。
希望这是有道理的,在此先感谢。
【问题讨论】:
标签: sql-server sql-server-2008 login