Force Drop login

Rédigé par Sozezzo - - Aucun commentaire

A login cannot be dropped while it is logged in. A login that owns any securable, server-level object, or SQL Server Agent job cannot be dropped.

This code can be used to drop Login from SQL Server and user name associated with this Login in different databases.


------------------------------------
-- Drop user - SQL Script         --   
------------------------------------
--
-- Login name to delete
DECLARE @userToDelete nvarchar(200) = 'TestLogin';
--
--
IF (NOT EXISTS (SELECT * FROM sys.syslogins AS L WHERE L.loginname = @userToDelete))
BEGIN
    RAISERROR('
    Login not found.
    ', 50000, 0) WITH log
END


DECLARE @sql nvarchar(max);

PRINT '--  CHECK Databases'
USE [master];
SET @sql = '';
select @sql=@sql+'USE ['+d.name+']; EXEC dbo.sp_changedbowner @loginame = N''sa'', @map = false;'+CHAR(13) from  sys.sysdatabases d left join master.sys.syslogins l on d.sid = l.sid WHERE l.name = 'TestLogin';
PRINT @sql;
EXEC (@sql);


PRINT '--  CHECK Jobs'
USE [master];
SET @sql = '';
select @sql=@sql+'EXEC msdb.dbo.sp_update_job @job_name=N'''+s.name+''', @owner_login_name=N''sa'';'+CHAR(13) from  msdb..sysjobs s left join master.sys.syslogins l on s.owner_sid = l.sid WHERE l.name = @userToDelete
PRINT @sql;
EXEC (@sql);


PRINT '--  CHECK Schemas'
SET @sql = '
DECLARE @sql nvarchar(max);
SET @sql = '''';
SELECT @sql=@sql+''ALTER AUTHORIZATION ON SCHEMA::['' + s.name + ''] TO [dbo];''+CHAR(13) FROM [?].sys.schemas AS s INNER JOIN [?].sys.sysusers AS u ON s.principal_id = u.uid WHERE (u.name = '''+@userToDelete+''')
IF NOT (@sql='''')
BEGIN
    SET @sql = ''USE [?]''+CHAR(13)+@sql+''DROP USER ['+@userToDelete+']''+CHAR(13);
    PRINT @sql;
    EXEC (@sql);
END
'
exec sp_MSforeachdb @sql;


PRINT '--  CHECK Connections'
USE [master];
SET @sql = '';
select @sql = @sql + 'KILL ' + cast(spid AS NVARCHAR(10)) + ';'+ char(13) FROM master..sysprocesses Where loginame = @userToDelete;
PRINT @sql;
EXEC (@sql);

PRINT '-- DROP Login'
SET @sql = 'DROP LOGIN ['+@userToDelete+']'+CHAR(13);
PRINT @sql;
EXEC (@sql);

GO

 

 

source: https://msdn.microsoft.com/en-us/library/ms188012.aspx

Enable broker service on all databases

Rédigé par Sozezzo - - Aucun commentaire

Enable broker service on all databases but it check if Service Broker is enabled.



-- ***************************************** --
--       SQL Script to ENABLE_BROKER
-- ***************************************** --
--
PRINT @@servername;
PRINT Getdate();
BEGIN TRY DROP TABLE #dbs; END TRY BEGIN CATCH END CATCH;
 
--#region Select databases to Enable Broker Service

SELECT [name] INTO #dbs
FROM sys.databases
WHERE
    database_id > 4
    AND is_broker_enabled = 0  -- check if Service Broker is enabled.
    AND name NOT IN ('ReportServer','ReportServerTempDB')

--#endregion Select databases to Enable Broker Service

USE [MASTER];
SET NOCOUNT ON;
DECLARE @name nvarchar(200);
DECLARE @sql NVARCHAR(MAX);
DECLARE @ToKill AS NVARCHAR(MAX);

WHILE (EXISTS(SELECT * FROM #dbs))
BEGIN

    SELECT TOP 1 @name = name
    FROM #dbs;
    DELETE FROM #dbs
    WHERE
        @name = name;

    DECLARE @msg nvarchar(200) = '-- SET ENABLE_BROKER Database : ' + @name;
    RAISERROR (@msg, 10, 1) WITH NOWAIT;

    SET @ToKill = '';
    SELECT @toKill = @ToKill + 'begin try kill ' + cast(spid AS NVARCHAR(10)) + '; print ''Ok   to kill : ' + cast(spid AS NVARCHAR(10)) + '''; end try begin catch print ''Fail to kill : ' + cast(spid AS NVARCHAR(10)) + '''; end catch;'
    FROM master..sysprocesses
    WHERE dbid = DB_ID(@name);

    RAISERROR (@tokill, 10, 1) WITH NOWAIT;
    EXEC (@tokill);

    SET @sql = 'ALTER DATABASE [' + @name + '] SET ENABLE_BROKER WITH NO_WAIT;'

    RAISERROR (@sql, 10, 1) WITH NOWAIT;
    EXEC (@sql);

END

Lire la suite de Enable broker service on all databases

Drop all databases SQL Server

Rédigé par Sozezzo - - Aucun commentaire

We have many ways to drop a database, but if you want to drop many databases.

You can have some problems with opened connections, but this script kill all connection and drop the database.


-- ***************************************** --
--       SQL Script to drop databases
-- ***************************************** --
--
PRINT @@servername;
PRINT Getdate();
BEGIN TRY DROP TABLE #dbs; END TRY BEGIN CATCH END CATCH;

--#region Select databases to DROP

SELECT [name] INTO #dbs
FROM sys.databases
WHERE
    database_id > 4
    AND name NOT IN ('ReportServer','ReportServerTempDB')

--#endregion Select databases to DROP

--#region Drop databases

USE [MASTER];
SET NOCOUNT ON;
DECLARE @name nvarchar(200);
DECLARE @sql NVARCHAR(MAX);
DECLARE @ToKill AS NVARCHAR(MAX);

WHILE (EXISTS(SELECT *
    FROM #dbs))
BEGIN

    SELECT TOP 1 @name = name
    FROM #dbs;
    DELETE FROM #dbs
    WHERE
        @name = name;

    DECLARE @msg nvarchar(200) = '-- DROP Database : ' + @name;
    RAISERROR (@msg, 10, 1) WITH NOWAIT;

    SET @ToKill = '';
    SELECT @toKill = @ToKill + 'begin try kill ' + cast(spid AS NVARCHAR(10)) + '; print ''Ok   to kill : ' + cast(spid AS NVARCHAR(10)) + '''; end try begin catch print ''Fail to kill : ' + cast(spid AS NVARCHAR(10)) + '''; end catch;'
    FROM master..sysprocesses
    WHERE dbid = DB_ID(@name);

    RAISERROR (@tokill, 10, 1) WITH NOWAIT;
    EXEC (@tokill);

    SET @sql = 'ALTER DATABASE [' + @name + '] SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE;'
    RAISERROR (@sql, 10, 1) WITH NOWAIT;
    EXEC (@sql);

    SET @sql = 'DROP DATABASE [' + @name + ']';
    RAISERROR (@sql, 10, 1) WITH NOWAIT;
    EXEC (@sql);

END

--#endregion Drop databases

 

sources:

http://stackoverflow.com/questions/349358/sql-server-print-output-doesnt-appear-immediately

http://stackoverflow.com/questions/5777483/drop-all-databases-from-server

 

Unused indexes

Rédigé par Sozezzo - - Aucun commentaire

Unused indexes should be deleted, but you would not drop all the unused indexes without deep analyse.

This a script delete all unused indexes.

- Nonclustered indexes
- Non primary keys
- Non unique
- Non unused  (#Total reads < 100)

 

Finding Unused Indexes -- Only Nonclustered

SELECT
     db_name() as DatabaseName
    ,sys.schemas.NAME AS ShemaName
    ,sys.tables.NAME AS TableName
    ,sys.indexes.NAME AS IndexName
    ,8 * SUM(sys.allocation_units.used_pages) AS IndexSize
    ,sys.dm_db_index_usage_stats.user_updates AS 'Total Writes'
    ,sys.dm_db_index_usage_stats.user_seeks + sys.dm_db_index_usage_stats.user_scans + sys.dm_db_index_usage_stats.user_lookups AS 'Total Reads'
    ,sys.dm_db_index_usage_stats.user_updates - (sys.dm_db_index_usage_stats.user_seeks + sys.dm_db_index_usage_stats.user_scans + sys.dm_db_index_usage_stats.user_lookups) AS 'Difference'
    ,'USE '+ db_name()+';' + 'DROP INDEX '+QUOTENAME(sys.schemas.NAME)+ '.' + QUOTENAME(sys.tables.NAME) + '.' +QUOTENAME(sys.indexes.NAME) + ';' + CHAR(13) + CHAR(10) + 'GO'
FROM sys.partitions
INNER JOIN sys.indexes ON sys.partitions.index_id = sys.indexes.index_id
    AND sys.partitions.object_id = sys.indexes.object_id
INNER JOIN sys.schemas
INNER JOIN sys.tables ON sys.schemas.schema_id = sys.tables.schema_id ON sys.partitions.object_id = sys.tables.object_id INNER JOIN sys.allocation_units ON sys.partitions.partition_id = sys.allocation_units.container_id INNER JOIN sys.dm_db_index_usage_stats ON sys.indexes.object_id = sys.dm_db_index_usage_stats.object_id
    AND sys.indexes.index_id = sys.dm_db_index_usage_stats.index_id
WHERE
        sys.indexes.is_primary_key = 0   -- non primary key
    AND sys.indexes.is_unique = 0        -- non unique
    AND sys.indexes.type in (2, 6, 7)     -- Only Nonclustered -- https://msdn.microsoft.com/en-us/library/ms173760.aspx
    AND (sys.dm_db_index_usage_stats.user_seeks + sys.dm_db_index_usage_stats.user_scans + sys.dm_db_index_usage_stats.user_lookups) < 100  -- unused !!!
GROUP BY
     sys.schemas.NAME
    ,sys.tables.NAME
    ,sys.indexes.NAME
    ,sys.dm_db_index_usage_stats.user_seeks
    ,sys.dm_db_index_usage_stats.user_scans
    ,sys.dm_db_index_usage_stats.user_lookups
    ,sys.dm_db_index_usage_stats.user_updates
ORDER BY IndexSize DESC;

Lire la suite de Unused indexes

Fil RSS des articles de cette catégorie