현재 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 권한을 부여 할 수 있습니다
이미 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
db_denydatareader db_datawriter에 의 db_datareader 및 db_backupoperator 사용자가 존재합니다. 프로 시저가 데이터베이스 소유자로 실행되므로 모든 사용자를 볼 수 있어야합니다. – Andomar
아, 저도 시도해 보았습니다. blah.sys.database_principals 문제에서 select *를 통해 해결할 수있었습니다. 그러나 sys.sql_logins에서 select *를 통해 모든 결과를 다시 얻지 못했습니다. 문제는 프로 시저가 하나의 데이터베이스에서 실행되지만 다른 (마스터)에 대해 프로 시저를 호출해야한다는 사실 때문에 발생했다고 생각합니다.하지만이 문제를 완전히 조사하지 않았 음을 인정해야합니다. 은 내가 가 지금까지 일을 당신이이 방법에 대한 어떤 생각이 있으면 내가 그들을 듣고 관심을 가질 것 같다 Foo 등 GRANT보기 어떤 정의했다 어쨌든 수정을 발견 생각 – Kurut