2012-12-16 4 views
0

그래서, 나는 내 친구의 웹 사이트에있는 코드와 레슬링 봤는데 설정 :이 sp_MSforeachdb와 데이터베이스를 통해 "반복"을 반환 한 데이터가

나는 데이터베이스 레벨 보안을 생성 할

8 Steps to Moving Database Logins

, 역할 및 Explicit Permissions 문을 하나의 출력에 저장하므로 반복적으로 복사 및 붙여 넣기가 수행되지 않으므로 서버의 모든 데이터베이스 (물론 tempdb 제외)에서 실행됩니다.

Declare @FullStatement varchar(MAX) 
Set @FullStatement = ' use [?]; SELECT dp.state_desc + N'' '' + dp.permission_name + N'' TO '' + cast(QUOTENAME(dpl.name COLLATE DATABASE_DEFAULT) as nvarchar(500)) AS TSQLScript 
FROM sys.database_permissions AS dp 
INNER JOIN sys.database_principals AS dpl ON (dp.grantee_principal_id = dpl.principal_id) 
WHERE dp.major_id = 0 
and dpl.name not like ''##%'' -- excluds PBM accounts 
and dpl.name not in (''dbo'', ''sa'', ''public'') 
ORDER BY dp.permission_name ASC, dp.state_desc ASC' 

Exec sp_MSforeachdb @FullStatement 

어떻게 내가 그대로 작동하지만 문이 모두 하나 개의 데이터 세트에 그렇게 등 테이블 변수, 임시 테이블을 사용하여, 불편하다, 무엇을 수정할 수 있습니다?

답변

4

David,

이게 원하는가요?

CREATE TABLE tempdb.dbo.Results (c1 VARCHAR(8000)) 

Declare @FullStatement varchar(MAX) 
Set @FullStatement = 'SELECT ''use [?]''; SELECT dp.state_desc + N'' '' + dp.permission_name + N'' TO '' + cast(QUOTENAME(dpl.name COLLATE DATABASE_DEFAULT) as nvarchar(500)) AS TSQLScript 
FROM [?].sys.database_permissions AS dp 
INNER JOIN [?].sys.database_principals AS dpl ON (dp.grantee_principal_id = dpl.principal_id) 
WHERE dp.major_id = 0 
and dpl.name not like ''##%'' -- excluds PBM accounts 
and dpl.name not in (''dbo'', ''sa'', ''public'') 
ORDER BY dp.permission_name ASC, dp.state_desc ASC' 

INSERT INTO tempdb.dbo.Results Exec sp_MSforeachdb @FullStatement 

select * FROM tempdb.dbo.Results 
+0

그게 효과가있어. 다른 2 개의 데이터베이스 카테고리를 추가하려고합니다. 나는 그게 그렇게 간단하지 않다고 믿을 수 없다. 나는 그 근처에서 뭔가를 시도했지만 오류가 계속 발생했습니다. – DavidStein

+1

차가움. 내 잘못, 나는 당신이 데이터베이스마다 되돌려주는 perms가 필요하다고 생각했다. 그 이유는 내가 사용 문을 추가 SELECT ''를 사용하여 제거 [?] ''; @FullStatement 초기화의 처음부터. – Norman

+0

죄송합니다. 정상적으로, 나는 그것을 깨닫고 내 의견을 삭제하고 다시 입력했습니다. 그래 네가 맞아. Use Statements 만 남겼습니다. – DavidStein

0

여러 가지 방법으로이를 수행 할 수 있습니다. PowerShell을 사용하여 모든 데이터베이스를 반복하고 결과를 Excel에 저장할 수 있습니다. 넬슨 씨는 powershell sql 대학 시리즈에서이 점을 알고 있습니다. 미안하지만, 당신을 위해 링크를 당길 것이지만 나는 공항에서 나의 전화를 타이핑하고있다.

+0

어, Powershell을 사용하지 않을 것입니다. 거기에 생성 된 문을 테이블 변수 또는 임시 테이블에로드 할 수있는 방법이 있습니까? – DavidStein

0

왜 데이터베이스 사용자 및 사용 권한을 스크립팅하고 있습니까? 이들은 데이터베이스에 있으며 데이터베이스를 이주 할 때 계속 존재합니다. 데이터베이스를 처음부터 다시 만들지 않는 한 그렇게 할 필요가 없습니다.