Tuesday, 27 May 2025

DBA - Script out login scripts SP.

 USE [master]

GO

IF OBJECT_ID('dbo.sp_hexadecimal') IS NOT NULL

    DROP PROCEDURE dbo.sp_hexadecimal

GO

CREATE PROCEDURE dbo.sp_hexadecimal

    @binvalue [varbinary](256)

    ,@hexvalue [nvarchar] (514) OUTPUT

AS

BEGIN

    DECLARE @i [smallint]

    DECLARE @length [smallint]

    DECLARE @hexstring [nchar](16)

    SELECT @hexvalue = N'0x'

    SELECT @i = 1

    SELECT @length = DATALENGTH(@binvalue)

    SELECT @hexstring = N'0123456789ABCDEF'

    WHILE (@i < =  @length)

    BEGIN

        DECLARE @tempint   [smallint]

        DECLARE @firstint  [smallint]

        DECLARE @secondint [smallint]

        SELECT @tempint = CONVERT([smallint], SUBSTRING(@binvalue, @i, 1))

        SELECT @firstint = FLOOR(@tempint / 16)

        SELECT @secondint = @tempint - (@firstint * 16)

        SELECT @hexvalue = @hexvalue

            + SUBSTRING(@hexstring, @firstint  + 1, 1)

            + SUBSTRING(@hexstring, @secondint + 1, 1)

        SELECT @i = @i + 1

    END

END

GO

IF OBJECT_ID('dbo.sp_help_revlogin') IS NOT NULL

    DROP PROCEDURE dbo.sp_help_revlogin

GO

CREATE PROCEDURE dbo.sp_help_revlogin

    @login_name [sysname] = NULL

AS

BEGIN

    DECLARE @name                  [sysname]

    DECLARE @type                  [nvarchar](1)

    DECLARE @hasaccess             [int]

    DECLARE @denylogin             [int]

    DECLARE @is_disabled           [int]

    DECLARE @PWD_varbinary         [varbinary](256)

    DECLARE @PWD_string            [nvarchar](514)

    DECLARE @SID_varbinary         [varbinary](85)

    DECLARE @SID_string            [nvarchar](514)

    DECLARE @tmpstr                [nvarchar](4000)

    DECLARE @is_policy_checked     [nvarchar](3)

    DECLARE @is_expiration_checked [nvarchar](3)

    DECLARE @Prefix                [nvarchar](4000)

    DECLARE @defaultdb             [sysname]

    DECLARE @defaultlanguage       [sysname]

    DECLARE @tmpstrRole            [nvarchar](4000)

    IF @login_name IS NULL

    BEGIN

        DECLARE login_curs CURSOR

        FOR

        SELECT p.[sid],p.[name],p.[type],p.is_disabled,p.default_database_name,l.hasaccess,l.denylogin,default_language_name = ISNULL(p.default_language_name,@@LANGUAGE)

        FROM sys.server_principals p

        LEFT JOIN sys.syslogins l ON l.[name] = p.[name]

        WHERE p.[type] IN ('S' /* SQL_LOGIN */,'G' /* WINDOWS_GROUP */,'U' /* WINDOWS_LOGIN */)

            AND p.[name] <> 'sa'

            AND p.[name] not like '##%'

        ORDER BY p.[name]

    END

    ELSE

        DECLARE login_curs CURSOR

        FOR

        SELECT p.[sid],p.[name],p.[type],p.is_disabled,p.default_database_name,l.hasaccess,l.denylogin,default_language_name = ISNULL(p.default_language_name,@@LANGUAGE)

        FROM sys.server_principals p

        LEFT JOIN sys.syslogins l ON l.[name] = p.[name]

        WHERE p.[type] IN ('S' /* SQL_LOGIN */,'G' /* WINDOWS_GROUP */,'U' /* WINDOWS_LOGIN */)

            AND p.[name] <> 'sa'

            AND p.[name] NOT LIKE '##%'

            AND p.[name] = @login_name

        ORDER BY p.[name]

    OPEN login_curs

    FETCH NEXT FROM login_curs INTO @SID_varbinary,@name,@type,@is_disabled,@defaultdb,@hasaccess,@denylogin,@defaultlanguage

    IF (@@fetch_status = - 1)

    BEGIN

        PRINT '/* No login(s) found for ' + QUOTENAME(@login_name) + N'. */'

        CLOSE login_curs

        DEALLOCATE login_curs

        RETURN - 1

    END

    SET @tmpstr = N'/* sp_help_revlogin script

** Generated ' + CONVERT([nvarchar], GETDATE()) + N' on ' + @@SERVERNAME + N'

*/'

    PRINT @tmpstr

    WHILE (@@fetch_status <> - 1)

    BEGIN

        IF (@@fetch_status <> - 2)

        BEGIN

            PRINT ''

            SET @tmpstr = N'/* Login ' + QUOTENAME(@name) + N' */'

            PRINT @tmpstr

            SET @tmpstr = N'IF NOT EXISTS (

    SELECT 1

    FROM sys.server_principals

    WHERE [name] = N''' + @name + N'''

    )

BEGIN'

            PRINT @tmpstr

            IF @type IN ('G','U') -- NT-authenticated Group/User

            BEGIN -- NT authenticated account/group 

                SET @tmpstr = N'    CREATE LOGIN ' + QUOTENAME(@name) + N'

    FROM WINDOWS

    WITH DEFAULT_DATABASE = ' + QUOTENAME(@defaultdb) + N'

        ,DEFAULT_LANGUAGE = ' + QUOTENAME(@defaultlanguage)

            END

            ELSE

            BEGIN -- SQL Server authentication

                -- obtain password and sid

                SET @PWD_varbinary = CAST(LOGINPROPERTY(@name, 'PasswordHash') AS [varbinary](256))

                EXEC dbo.sp_hexadecimal @PWD_varbinary, @PWD_string OUT

                EXEC dbo.sp_hexadecimal @SID_varbinary, @SID_string OUT

                -- obtain password policy state

                SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END

                FROM sys.sql_logins

                WHERE [name] = @name


                SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END

                FROM sys.sql_logins

                WHERE [name] = @name


                SET @tmpstr = NCHAR(9) + N'CREATE LOGIN ' + QUOTENAME(@name) + N'

    WITH PASSWORD = ' + @PWD_string + N' HASHED

        ,SID = ' + @SID_string + N'

        ,DEFAULT_DATABASE = ' + QUOTENAME(@defaultdb) + N'

        ,DEFAULT_LANGUAGE = ' + QUOTENAME(@defaultlanguage)


                IF @is_policy_checked IS NOT NULL

                BEGIN

                    SET @tmpstr = @tmpstr + N'

        ,CHECK_POLICY = ' + @is_policy_checked

                END


                IF @is_expiration_checked IS NOT NULL

                BEGIN

                    SET @tmpstr = @tmpstr + N'

        ,CHECK_EXPIRATION = ' + @is_expiration_checked

                END

            END

            IF (@denylogin = 1)

            BEGIN -- login is denied access

                SET @tmpstr = @tmpstr

                    + NCHAR(13) + NCHAR(10) + NCHAR(9) + N''

                    + NCHAR(13) + NCHAR(10) + NCHAR(9) + N'DENY CONNECT SQL TO ' + QUOTENAME(@name)

            END

            ELSE IF (@hasaccess = 0)

            BEGIN -- login exists but does not have access

                SET @tmpstr = @tmpstr

                    + NCHAR(13) + NCHAR(10) + NCHAR(9) + N''

                    + NCHAR(13) + NCHAR(10) + NCHAR(9) + N'REVOKE CONNECT SQL TO ' + QUOTENAME(@name)

            END

            IF (@is_disabled = 1)

            BEGIN -- login is disabled

                SET @tmpstr = @tmpstr

                    + NCHAR(13) + NCHAR(10) + NCHAR(9) + N''

                    + NCHAR(13) + NCHAR(10) + NCHAR(9) + N'ALTER LOGIN ' + QUOTENAME(@name) + N' DISABLE'

            END

            SET @Prefix =

                NCHAR(13) + NCHAR(10) + NCHAR(9) + N''

                + NCHAR(13) + NCHAR(10) + NCHAR(9) + N'EXEC [master].dbo.sp_addsrvrolemember @loginame = N'''

            SET @tmpstrRole = N''

            SELECT @tmpstrRole = @tmpstrRole

                + CASE WHEN sysadmin = 1 THEN @Prefix + LoginName + N''', @rolename = N''sysadmin''' ELSE '' END

                + CASE WHEN securityadmin = 1 THEN @Prefix + LoginName + N''', @rolename = N''securityadmin''' ELSE '' END

                + CASE WHEN serveradmin = 1 THEN @Prefix + LoginName + N''', @rolename = N''serveradmin''' ELSE '' END

                + CASE WHEN setupadmin = 1 THEN @Prefix + LoginName + N''', @rolename = N''setupadmin''' ELSE '' END

                + CASE WHEN processadmin = 1 THEN @Prefix + LoginName + N''', @rolename = N''processadmin''' ELSE '' END

                + CASE WHEN diskadmin = 1 THEN @Prefix + LoginName + N''', @rolename = N''diskadmin''' ELSE '' END

                + CASE WHEN dbcreator = 1 THEN @Prefix + LoginName + N''', @rolename = N''dbcreator''' ELSE '' END

                + CASE WHEN bulkadmin = 1 THEN @Prefix + LoginName + N''', @rolename = N''bulkadmin''' ELSE '' END

            FROM (

                SELECT

                    SUSER_SNAME([sid])AS LoginName

                    ,sysadmin

                    ,securityadmin

                    ,serveradmin

                    ,setupadmin

                    ,processadmin

                    ,diskadmin

                    ,dbcreator

                    ,bulkadmin

                FROM sys.syslogins

                WHERE (    sysadmin <> 0

                        OR securityadmin <> 0

                        OR serveradmin <> 0

                        OR setupadmin <> 0

                        OR processadmin <> 0

                        OR diskadmin <> 0

                        OR dbcreator <> 0

                        OR bulkadmin <> 0

                        )

                    AND [name] = @name

                ) L

            IF @tmpstr <> '' PRINT @tmpstr

            IF @tmpstrRole <> '' PRINT @tmpstrRole

            PRINT 'END'

        END

        FETCH NEXT FROM login_curs INTO @SID_varbinary,@name,@type,@is_disabled,@defaultdb,@hasaccess,@denylogin,@defaultlanguage

    END

    CLOSE login_curs

    DEALLOCATE login_curs

    RETURN 0

END

DBA - Script out SQL Logins1

 SET ANSI_NULLS ON

GO


SET QUOTED_IDENTIFIER ON

GO


CREATE FUNCTION [dbo].[fn_hexadecimal] 

(

    -- Add the parameters for the function here

     @binvalue varbinary(256)

)RETURNS VARCHAR(256) AS BEGIN


    DECLARE @charvalue varchar(256)

    DECLARE @i int

    DECLARE @length int

    DECLARE @hexstring char(16)

    SELECT @charvalue = '0x'

    SELECT @i = 1

    SELECT @length = DATALENGTH (@binvalue)

    SELECT @hexstring = '0123456789ABCDEF' 

    WHILE (@i  < = @length) 

    BEGIN

      DECLARE @tempint int

      DECLARE @firstint int

      DECLARE @secondint int

      SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))

      SELECT @firstint = FLOOR(@tempint/16)

      SELECT @secondint = @tempint - (@firstint*16)

      SELECT @charvalue = @charvalue +

        SUBSTRING(@hexstring, @firstint+1, 1) +

        SUBSTRING(@hexstring, @secondint+1, 1)

      SELECT @i = @i + 1

    END

    return @charvalue


END

GO



SET NOCOUNT ON

GO

--use MASTER

GO

PRINT '-----------------------------------------------------------------------------'

PRINT '-- Script created on ' + CAST(GETDATE() AS VARCHAR(100))

PRINT '-----------------------------------------------------------------------------'

PRINT ''

PRINT '-----------------------------------------------------------------------------'

PRINT '-- Create the windows logins'

PRINT '-----------------------------------------------------------------------------'

SELECT 'IF NOT EXISTS (SELECT * FROM master.sys.server_principals WHERE [name] = ''' + [name] + ''')

    CREATE LOGIN [' + [name] + '] FROM WINDOWS WITH DEFAULT_DATABASE=[' + 

        default_database_name + '], DEFAULT_LANGUAGE=[us_english]

GO


'

FROM master.sys.server_principals

where type_desc In ('WINDOWS_GROUP', 'WINDOWS_LOGIN')

AND [name] not like 'BUILTIN%'

and [NAME] not like 'NT AUTHORITY%'

and [name] not like '%\SQLServer%'

GO


PRINT '-----------------------------------------------------------------------------'

PRINT '-- Create the SQL Logins'

PRINT '-----------------------------------------------------------------------------'

select 'IF NOT EXISTS (SELECT * FROM master.sys.sql_logins WHERE [name] = ''' + [name] + ''')

    CREATE LOGIN [' + [name] + '] 

        WITH PASSWORD=' + [master].[dbo].[fn_hexadecimal](password_hash) + ' HASHED,

        SID = ' + [master].[dbo].[fn_hexadecimal]([sid]) + ',  

        DEFAULT_DATABASE=[' + default_database_name + '], DEFAULT_LANGUAGE=[us_english], 

        CHECK_EXPIRATION=' + CASE WHEN is_expiration_checked = 1 THEN 'ON' ELSE 'OFF' END + ', CHECK_POLICY=OFF

GO

IF EXISTS (SELECT * FROM master.sys.sql_logins WHERE [name] = ''' + [name] + ''')

    ALTER LOGIN [' + [name] + ']

        WITH CHECK_EXPIRATION=' + 

            CASE WHEN is_expiration_checked = 1 THEN 'ON' ELSE 'OFF' END + ', CHECK_POLICY=' + 

            CASE WHEN is_policy_checked = 1 THEN 'ON' ELSE 'OFF' END + '

GO



'

--[name], [sid] , password_hash 

from master.sys.sql_logins 

where type_desc = 'SQL_LOGIN' 

and [name] not in ('sa', 'guest')


PRINT '-----------------------------------------------------------------------------'

PRINT '-- Disable any logins'

PRINT '-----------------------------------------------------------------------------'

SELECT 'ALTER LOGIN [' + [name] + '] DISABLE

GO

from master.sys.server_principals 

where is_disabled = 1


PRINT '-----------------------------------------------------------------------------'

PRINT '-- Assign groups'

PRINT '-----------------------------------------------------------------------------'

select 

'EXEC master..sp_addsrvrolemember @loginame = N''' + l.name + ''', @rolename = N''' + r.name + '''

GO


'

from master.sys.server_role_members rm

join master.sys.server_principals r on r.principal_id = rm.role_principal_id

join master.sys.server_principals l on l.principal_id = rm.member_principal_id

where l.[name] not in ('sa')

AND l.[name] not like 'BUILTIN%'

and l.[NAME] not like 'NT AUTHORITY%'

and l.[name] not like '%\SQLServer%'

DBA - How to find CPU intensive queries

 -- Clear the query plan cache (don't execute this in production!)

dbcc freeproccache
go
 
-- CPU intensive query over adventureworks database
select TransactionId,ProductId,
             ReferenceOrderId,ReferenceOrderLineId,
             TransactionDate,TransactionType,
             Quantity,ActualCost,
             ModifiedDate
from production.TransactionHistory
       order by modifiedDate desc



Now, let’s check the most cpu intensive queries in our system:
SELECT
       -- using statement_start_offset and
       -- statement_end_offset we get the query text
       -- from inside the entire batch
       SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,
                           ((CASE qs.statement_end_offset
                                        WHEN -1 THEN DATALENGTH(qt.TEXT)
                                        ELSE qs.statement_end_offset
                           END
                           - qs.statement_start_offset)/2)+1)
                           as [Text],
qs.execution_count,
qs.total_logical_reads, qs.last_logical_reads,
qs.total_logical_writes, qs.last_logical_writes,
qs.total_worker_time,
qs.last_worker_time,
-- converting microseconds to seconds
qs.total_elapsed_time/1000000 total_elapsed_time_in_S,
qs.last_elapsed_time/1000000 last_elapsed_time_in_S,
qs.last_execution_time,
qp.query_plan
FROM sys.dm_exec_query_stats qs
       -- Retrieve the query text
       CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
       -- Retrieve the query plan
       CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY qs.total_worker_time DESC -- CPU time

SQL_DBA- Ip Address Ping

Start-Transcript - path C:/Script/PingLog.txt -Append   Ping.exe -t spiceworks.com | ForEach { "{0} - {1}" -f (Get-Date), $_ } ...