SET @SQL_SKEL = N' SELECT ''__DBNAME__'' AS DB ,SC.NAME AS SCHEMA_NM ,DP.NAME AS PRINCIPAL_NAME ,DP.TYPE_DESC --,DP.DEFAULT_SCHEMA_NAME --,OWNING_PRINCIPAL_ID FROM __DBNAME__.SYS.SCHEMAS SC LEFT OUTER JOIN __DBNAME__.SYS.DATABASE_PRINCIPALS DP ON SC.PRINCIPAL_ID = DP.PRINCIPAL_ID WHERE SC.PRINCIPAL_ID <> SC.SCHEMA_ID UNION ALL'
SELECT @SQL = @SQL + REPLACE(@SQL_SKEL, '__DBNAME__', NAME) FROM sys.databases WHERE name NOT IN('master', 'tempdb', 'model', 'msdb') AND name NOT LIKE 'reportserver%' AND state = 0 -- online
SET @SQL = LEFT(@SQL, LEN(@SQL) - 9)
INSERT INTO @SCHEMA_LIST EXEC SP_EXECUTESQL @SQL
SELECT * FROM @SCHEMA_LIST
IF (@@ROWCOUNT > 0) BEGIN /* 스키마 소유자가 다른건 변경 */ SET @SQL_SKEL = N'EXEC __DBNAME__.dbo.SP_EXECUTESQL N''ALTER AUTHORIZATION ON SCHEMA::[__SCHEMA__] TO [__SCHEMA__]''; ' + CHAR(13) SET @SQL = N''
아래 sql 돌려보시고 print 되는 구문 있으면 실행하세요.
SET NOCOUNT ON
/* 데이터베이스 소유자 검색 */
select db.name as dbname
,sl.name
from sys.databases db
inner join
sys.syslogins sl
on db.owner_sid = sl.sid
/*
db별 스키마와 소유자가 다른 건
*/
DECLARE @SQL NVARCHAR(MAX) = N''
,@SQL_SKEL NVARCHAR(500)
DECLARE @SCHEMA_LIST TABLE(
DB VARCHAR(256)
,SCHEMA_NAME VARCHAR(256)
,PRINCIPAL_NAME VARCHAR(256)
,PRINCIPAL_TYPE VARCHAR(32)
)
SET @SQL_SKEL = N'
SELECT ''__DBNAME__'' AS DB
,SC.NAME AS SCHEMA_NM
,DP.NAME AS PRINCIPAL_NAME
,DP.TYPE_DESC
--,DP.DEFAULT_SCHEMA_NAME
--,OWNING_PRINCIPAL_ID
FROM __DBNAME__.SYS.SCHEMAS SC
LEFT OUTER JOIN
__DBNAME__.SYS.DATABASE_PRINCIPALS DP
ON SC.PRINCIPAL_ID = DP.PRINCIPAL_ID
WHERE SC.PRINCIPAL_ID <> SC.SCHEMA_ID
UNION ALL'
SELECT @SQL = @SQL + REPLACE(@SQL_SKEL, '__DBNAME__', NAME)
FROM sys.databases
WHERE name NOT IN('master', 'tempdb', 'model', 'msdb')
AND name NOT LIKE 'reportserver%'
AND state = 0 -- online
SET @SQL = LEFT(@SQL, LEN(@SQL) - 9)
INSERT INTO @SCHEMA_LIST
EXEC SP_EXECUTESQL @SQL
SELECT *
FROM @SCHEMA_LIST
IF (@@ROWCOUNT > 0) BEGIN
/*
스키마 소유자가 다른건 변경
*/
SET @SQL_SKEL = N'EXEC __DBNAME__.dbo.SP_EXECUTESQL N''ALTER AUTHORIZATION ON SCHEMA::[__SCHEMA__] TO [__SCHEMA__]''; ' + CHAR(13)
SET @SQL = N''
SELECT @SQL = @SQL + REPLACE(REPLACE(@SQL_SKEL, '__DBNAME__', DB), '__SCHEMA__', SCHEMA_NAME)
FROM @SCHEMA_LIST
PRINT @SQL
-- EXEC SP_EXECUTESQL @SQL
END