2009-11-17 3 views
0

현재 MS SQL 2000 서버를 SQL 2008로 업데이트하고 있습니다. 업그레이드 도우미가 강조하는 문제 중 하나는 문서화되지 않은 테이블 sysxlogins가 제거되었다는 것입니다.SQL 2008의 sysusers 및 sysxlogins에 대한 변경

현재 'foo'사용자가 'bar'사용자가 데이터베이스에 있는지 확인하기 위해 실행하는 절차가 있습니다. 사용자가 사용자의 암호가 표시 줄 응용 프로그램에 로그인을 허용 할 것인지를 결정하기 위해 절차에 전달 된 암호와 비교 존재하는 경우는 다음과 같습니다 :이 모든 작품을 잘

@UserName Varchar(50), 
@Password Varchar(50) 

As 
Set NoCount On 

------------------------------------------------------------------------------------ 
-- Check username 
------------------------------------------------------------------------------------ 
If Exists 
(
    select top 1 name 
    from blah.dbo.sysusers With (NoLock) 
    where name = @UserName 
) 
Begin 

    ------------------------------------------------------------------------------------ 
    -- Check Password 
    ------------------------------------------------------------------------------------ 

    If Not Exists 
    (
     Select * 
     From master.dbo.sysxlogins With (NoLock) 
     Where srvid IS NULL 
     And name = @Username 
     And (((@Password is null) or (@Password = '') and password is null) 
     Or (pwdcompare(@Password, password, (CASE WHEN xstatus&2048 = 2048 THEN 1 ELSE 0 END)) = 1)) 
    ) 
    Begin 

     Return 2 

    End 

    Else 

    Begin 

     ------------------------------------------------------------------------------------ 
     -- Check Role 
     ------------------------------------------------------------------------------------ 

     Select usg.name 
     From blah.dbo.sysusers usu 
     left outer join (blah.dbo.sysmembers mem inner join blah.dbo.sysusers usg on mem.groupuid = usg.uid) on usu.uid = mem.memberuid 
     left outer join syslogins lo on usu.sid = lo.sid 
     where usu.name = @Username 
    and usg.name not like 'db_%' 

     Return 0 -- Username and password correct 

    End 

End 

Else 

Begin 

     Return 1 -- Username incorrect 

End 

을 SQL 2000에서는 아직 문서화되지 않은 시스템 테이블을 사용하여 2008 년에 작동해야합니다.

두 가지 문제가 있습니다. 첫 번째 문제는 foo가 더 이상 모든 데이터베이스 사용자를 볼 수 없다는 것입니다. 실행 중 :

select * from blah.dbo.sysusers 

또는 마이크로 소프트의 권장 대안 :

select * from blah.sys.database_principals 

나는이 public 역할의 구성원이 더 이상은 시스템 관리자의 구성원 않는 오브젝트 메타 데이터 또는 개체에 대한보기 정의 권한이 액세스 할 수 없기 때문이다 이해 .

foo는 sysadmin의 구성원이 될 수 없으므로 foo에 View Definition 권한을 부여해야한다고 이해하고 있지만 어떤 객체에 있습니까? 나는 시스템보기에서 그렇게하지 않는다고 생각합니다. 그래서 모든 단일 사용자에게 그렇게합니까?

둘째, 비슷하게 sysxlogins에 대한 참조를 sys.sql_logins로 변경해야합니다. 다시 foo는 실행시에만 자신과 sa를 볼 수 있습니다

select * from sys.sql_logins 

이 목록에있는 모든 서버 로그인을 보려면 어떻게해야합니까?

코드에서 sysmembers 및 syslogins에 액세스 할 때 비슷한 문제가있을 수 있지만 위의 두 예제를 이해하면 나머지를 정렬하는 데 도움이되기를 바랍니다. 당신은 한 로그인 마스터 데이터베이스에서 사용자를 가지고로, sys.database_principals을 마우스 오른쪽 버튼으로 직접 SELECT 권한을 부여 할 수 있습니다

답변

1

사전에

감사합니다. 예를 들면 다음과 같습니다.

use master 
create user MyUser for login MyUser 
grant select on sys.database_principals to MyUser 

그런 다음 SQL Server 2008에서는 관리자에 대해서도 암호가 암호화됩니다. 그러나 암호를 변경하여 암호를 확인할 수는 있습니다. 이전 암호가 올바르지 않으면 변경 절차에서 오류가 발생합니다.

declare @rc int 
begin try 
    exec @rc = sp_password 'welcome', 'welcome', 'MyUser' 
end try 
begin catch 
    set @rc = ERROR_NUMBER() 
end catch 

-- Should be 0 on success 
select @rc 

이 기능을 사용하려면 로그인 속성 대화 상자에서 Enforce password policy을 비활성화해야합니다. 그렇지 않으면 정책에 따라 암호가 너무 자주 변경되는 것을 방지 할 수 있습니다.

+0

이미 foo에 sys.database_principals에서 select를 부여했습니다. 그러나 foo로 로그인하고 sys.database_principals에서 *를 선택하면 sysadmin 권한을 가진 사용자로 실행 한 결과의 하위 집합 인 다음 결과 만 표시됩니다. public dbo 손님 INFORMATION_SCHEMA SYS foo는 대한 db_owner 과 db_accessadmin db_securityadmin db_ddladmin을 당신이 경우 확인이 OWNER' AS EXECUTE WITH'와 저장 프로 시저를 만들 수 db_denydatawriter – Kurut

+0

db_denydatareader db_datawriter에 의 db_datareader 및 db_backupoperator 사용자가 존재합니다. 프로 시저가 데이터베이스 소유자로 실행되므로 모든 사용자를 볼 수 있어야합니다. – Andomar

+0

아, 저도 시도해 보았습니다. blah.sys.database_principals 문제에서 select *를 통해 해결할 수있었습니다. 그러나 sys.sql_logins에서 select *를 통해 모든 결과를 다시 얻지 못했습니다. 문제는 프로 시저가 하나의 데이터베이스에서 실행되지만 다른 (마스터)에 대해 프로 시저를 호출해야한다는 사실 때문에 발생했다고 생각합니다.하지만이 문제를 완전히 조사하지 않았 음을 인정해야합니다. 은 내가 가 지금까지 일을 당신이이 방법에 대한 어떤 생각이 있으면 내가 그들을 듣고 관심을 가질 것 같다 Foo 등 GRANT보기 어떤 정의했다 어쨌든 수정을 발견 생각 – Kurut

1

GRANT SELECT ON...은 마스터 데이터베이스에 사용자를 추가해야하므로 번거롭다 고 생각합니다.아래는 나를위한 솔루션이었다

USE master 
GRANT VIEW ANY DEFINITION TO foo 

당신은 서버 버전은 모든 정의는 그것이 비록 SQL 2005에서 작동하는 8 (GRANT보기 다음 높은 경우 확인해야 SQL의 다양한 버전에서 작동하는 응용 프로그램이있는 경우 필요없는 것처럼 보입니다).