2016-02-26 135 views
0

我的客戶正在開發一個安全項目,其中DBA tean以外的任何用戶具有數據庫或服務器級別/ dbo所有者權限的sysadmin並刪除所有SQL Server中的提升權限。在這樣做之前,我們想要備份安全性,以防萬一發生中斷。任何人都可以幫助腳本?我有sp_rev_login備份登錄,但想用一個非常簡單直接的解決方案。任何想法都歡迎。謝謝SQL Server中的備份用戶/登錄

回答

0

Technet腳本中心截取的,這個腳本給我們的用戶,角色,對象權限以及

**--Server level Logins and roles** 
SELECT sp.name AS LoginName,sp.type_desc AS LoginType, sp.default_database_name AS DefaultDBName,slog.sysadmin AS SysAdmin,slog.securityadmin AS SecurityAdmin,slog.serveradmin AS ServerAdmin, slog.setupadmin AS SetupAdmin, slog.processadmin AS ProcessAdmin, slog.diskadmin AS DiskAdmin, slog.dbcreator AS DBCreator,slog.bulkadmin AS BulkAdmin 
FROM sys.server_principals sp JOIN master..syslogins slog 
ON sp.sid=slog.sid 
WHERE sp.type <> 'R' AND sp.name NOT LIKE '##%' 

--Databases users and roles 
DECLARE @SQLStatement VARCHAR(4000) 
DECLARE @T_DBuser TABLE (DBName SYSNAME, UserName SYSNAME, AssociatedDBRole NVARCHAR(256)) 
SET @SQLStatement=' 
SELECT ''?'' AS DBName,dp.name AS UserName,USER_NAME(drm.role_principal_id) AS AssociatedDBRole 
FROM ?.sys.database_principals dp 
LEFT OUTER JOIN ?.sys.database_role_members drm 
ON dp.principal_id=drm.member_principal_id 
WHERE dp.sid NOT IN (0x01) AND dp.sid IS NOT NULL AND dp.type NOT IN (''C'') AND dp.is_fixed_role <> 1 AND dp.name NOT LIKE ''##%'' AND ''?'' NOT IN (''master'',''msdb'',''model'',''tempdb'') ORDER BY DBName' 
INSERT @T_DBuser 
EXEC sp_MSforeachdb @SQLStatement 
SELECT * FROM @T_DBuser ORDER BY DBName 

--Get objects permission of specified user database 
USE <Database Name> 
GO 
DECLARE @Obj VARCHAR(4000) 
DECLARE @T_Obj TABLE (UserName SYSNAME, ObjectName SYSNAME, Permission NVARCHAR(128)) 
SET @Obj=' 
SELECT Us.name AS username, Obj.name AS object, dp.permission_name AS permission 
FROM sys.database_permissions dp 
JOIN sys.sysusers Us 
ON dp.grantee_principal_id = Us.uid 
JOIN sys.sysobjects Obj 
ON dp.major_id = Obj.id ' 
INSERT @T_Obj 
EXEC sp_MSforeachdb @Obj 

SELECT * FROM @T_Obj 

樣本輸出:

DBName UserName AssociatedDBRole 
PerformanceV3 public NULL 
PerformanceV3 dbo db_owner 
PerformanceV3 guest NULL 
+0

我想備份用戶的安全性,以防萬一我需要安全回來我應該能夠恢復腳本。換句話說,創建具有相同安全性的用戶/登錄腳本 – Ramya

0

使用生成的腳本任務,並選擇用戶。將腳本另存爲文件作爲備份。

查找具有不應該的SA的登錄。

SELECT 'ALTER SERVER ROLE [sysadmin] DROP MEMBER [' + syslogins.name + '] GO;' 
FROM sys.syslogins 
WHERE syslogins.name NOT IN (<dba GROUP/logins>) 

這應該足以生成remove SA。如果不想複製/粘貼,可以將輸出粘貼到臨時表並在其上運行光標以執行刪除。

+0

我們正在爲大約1800個SQL Server創建20,000多個數據庫。我們正在嘗試提供某種自動化來備份安全性,然後再放棄用戶/登錄 – Ramya

+0

@Ramya然後,您需要使用權限生成腳本對所有這些服務器進行多重查詢。其中,有幾個版本已經在這裏和這裏。您可以在SSMS中執行此操作,或設置一個簡單的應用程序,該應用程序從您的服務器列表中提取並將權限轉儲到文件或表中。但是,如果您正在運行SQL備份,則您的權限位於備份中,但聽起來您需要長時間安全備份。 –

+0

你介意給我一些鏈接,以達到類似的要求嗎?我可以編寫一個ssis包來從所有服務器獲取數據。我只需要sql腳本來執行我的要求 – Ramya