Я восстановил две базы данных SQL Server 2005 (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, не могу понять.
Надеюсь, это имеет смысл, заранее спасибо.