Generate Attach and Detach Database Script for All User Databases on SQL Instance


Managing your SQL Server databases often requires attaching and detaching databases. Below is a T-SQL script to generate the attach and detach commands for all user databases on a SQL Server instance. This script can be used on SQL Server versions 2008, 2012, 2014, and 2016.

Script to Generate Attach and Detach Commands

SQL server SSIS Notes

 SQL server SSIS  Notes             Download 

How to move system databases from one location to another location in SQL server


Move tempdb:

1) first we have to know the location of tempdb data file and log file location by using below query
use tempdb
go
exec sp_helpfile
go

2) run the below query to save the sql server new location of tempdb data file and log file path

alter database tempdb modify file (name=tempdev, filename='E:\sysdbs\mdf\tempdb.mdf')
go
alter database tempdb modify file (name=templog, filename='E:\sysdbs\ldf\templog.ldf')
go

after execute the above query it shows message like the sql server save your catalog but you must restart the sql server

3) stop the sql server

4) start the sql server

5)verify the path for tempdb data file and log file by using below query
exec sp_helpfile
go

6) whenever restart the sql server new tempdb will be created so automatically the new tmpdb will created in new location  goto old location and delete the old tempdb files


move model :

1) first we have to know the location of tempdb data file and log file location by using below query
use model
go
exec sp_helpfile
go

2)run the below query to save the sql server new location of model data file and log file path

alter database model modify file (name=modeldev, filename='E:\sysdbs\mdf\model.mdf')
go
alter database model modify file (name=modellog, filename='E:\sysdbs\ldf\modellog.ldf')
go

after execute the above query it shows message like the sql server save your catalog but you must restart the sql server

3) stop the sql server

4)move the  model databse data file and log file from old location to new location

5) start the sql server

6)verify the path for model data file and log file by using below query
exec sp_helpfile
go


move msdb : 

1) first we have to know the location of msdb data file and log file location by using below query
use msdb
go
exec sp_helpfile
go

2)run the below query to save the sql server new location of msdb data file and log file path

alter database msdb modify file (name=msdbdata, filename='E:\sysdbs\mdf\msdbdata.mdf')
go
alter database msdb modify file (name=msdblog, filename='E:\sysdbs\ldf\msdblog.ldf')
go

after execute the above query it shows message like the sql server save your catalog but you must restart the sql server

3) stop the sql server

4)move the  msdb data file and log file from old location to new location

5) start the sql server

6)verify the path for model data file and log file by using below query
exec sp_helpfile
go

move master :

1) copy the startup paramaeter(sql server configuration manager---sql server services---sql server(mssqlserver)---properties---advanced---startup parameter)

-dC:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\master.mdf;-eC:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log\ERRORLOG;-lC:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\mastlog.ldf

2) stop the sql server

3) move the master data file and log file from old location to new location

4)paste the startup parameter as a new location of master data fil;e and log file

(sql server configuration manager---sql server services---sql server(mssqlserver)---properties---advanced---startup parameter)

-dE:\sysdbs\mdf\master.mdf;-eC:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log\ERRORLOG;-lE:\sysdbs\ldf\mastlog.ldf

apply ok

5)it shows one message like system save the ur request but you must restart the sql server to apply these rules

6) start the sql server

7)if run sql server there is no issues if sql server will not  work check the startup parameters(startup parameters are very senstive it doesnt have single extra collan or space etc)

8)check the new path of master database data file and log file by using below query

exec sp_helpfile



T-SQL TRANSACT STRUCTURED QUERY LANGUAGE

T-SQL

TRANSACT STRUCTURED QUERY LANGUAGE

            This is a 4th generated intermediate language between user and SQL Server. Whenever user wants to interact with SQL Server, he has to interact with SQL Server through T-SQL. It includes the following Sub Languages

  1. DDL (Data Definition Language)
  2. DML (Data Manipulation Language)
  3. DCL (Data Control Language)
  4. TCL (Transaction Control Language)

Things to Observe:

  1. While writing the Queries using T-SQL in SQL Server Management Studio we need not to follow any particular case. Because T-SQL is case insensitive language.
  2. After writing the Query, we need to select that query using either mouse or keyboard.
  3. Now Press F5 ( Execute Key).
  4. Then the results are displayed in a separate window called Result window or Result Pane.
  5. Use Ctrl+R to Hide/Show the Result window or Result Pane.
  6. Use F8 for Object Explorer
Note:

  1. SQL SERVER can handle nearly 32767 Databases
  2. Each Database can handle nearly 2 billion Database Objects.
  3. Each Table can handle nearly 1024 columns
  4. Each Table can handle nearly 1 million Rows.

SP in Fundamental level

SP in Fundamental level:

SP_RENAMEDB: Here SP stands for Stored Procedure. This stored procedure is used to change the name of the existing database.

Syntax: SP_RENAMEDB ‘OLD DATABASENAME’, ‘NEW DATABASENAME’

            E.g.: SP_RENAMEDB  ‘NRSTT’, ‘NRSTTS’

The above statement renames (changes the database name) NRSTT to NRSTTS

SP_RENAME: This stored procedure is used for changing the name of the table and for changing the name of the column

i. Syntax to change the name of the table

SP_RENAME ‘OLD TABLENAME’, ‘NEW TABLENAME’

E.g.      SP_RENAME ‘EMP’, ‘EMPLOY’

The above stored procedure changes the name of EMP table to EMPLOY


ii. Syntax to change the name of the column

SP_RENAME ‘TABLE.OLDCOLUMN NAME’, ‘NEW COLUMNNAME’

E.g.      SP_RENAME ‘STUDENT.ADR’, ‘ADDRESS’

The above stored procedure changes the name of ADR column to ADDRESS in STUDENT table.

SP_HELP: This stored procedure is used to display the description of a specific table.

Syntax: SP_HELP TABLENAME

E.g.: SP_HELP EMP

The above stored procedure displays the description of EMP table

SP_DATADASES: This Stored procedure displays the list of databases available in SQL Server.

Syntax: SP_DATABASES

SP_TABLES: This stored procedure displays the list of tables available in the current database.

Syntax: SP_TABLES

SP_HELPDB: This stored procedure is used to display the description of  master and log data file information of a specific database

Syntax: SP_HELPDB Database-Name

Ex: SP_HELPDB SAMPLE

SP_SPACEUSED: This stored procedure is used to find the memory status of the current database

Syntax: SP_SPACEUSED


Collation levels and default collation

Collation levels and default collation:

Collation can be set at 4 levels in SQL Server:
1.       Server
2.       Database
3.       Columns
4.       Expression

But collations are compared either at columns level or in expressions. So I am starting from lower to upper levels. The collations of upper two levels (server and database) are only helpful in providing default collation to columns and expressions.
Expression collation: All literals, variables and parameters and functions without any input parameters, by default get the collation of database.

Column collation: When we create a table we can specify a collation explicitly for all character data type (char, nchar, varchar, nvarchar, text, ntext) columns. If not specified then collation of database would be the default collation of a column. The collation of a column can be changed by using an ALTER TABLE statement similar to the following:

ALTER TABLE TestTab ALTER COLUMN CharCol CHAR(10) COLLATE Greek_CS_AI

Database collation: When we create a new database we can specify collation. If not specify then collation of model database is assigned as default collation. To know the collation of database use below statement:

SELECT DATABASEPROPERTYEX('testDB', 'Collation') SQLCollation

Database collation can be changed using the ALTER DATABASE statement as below.:

ALTER DATABASE myDB COLLATE Greek_CS_AI

When collation of database is changed it does not automatically change the collation of all columns of all tables. But the new collation would be the default collation for new columns created hence forth and for expressions.

Server collation: This is set during SQL Server installation. It’s the default collation for system databases. Because this is the collation of model database so this would be the default collation for all new databases that would be created on this server. The server collation can not be changed. To query the server collation use the below statement:

SELECT CONVERT (varchar, SERVERPROPERTY('collation'))

Executing a SQL statement from command prompt:

Executing a SQL statement from command prompt:

Sometimes we need to execute some –T-SQL script from command prompt. This is a common requirement when some t-sql scripts are needed to be scheduled by windows scheduler.

Here I will explain how we can execute T-SQL script from command prompt. Below I created an executable file (.bat) to create a backup of AdventureWorks database so that I can schedule this executable using Windows scheduler.

 Create a text file for example c:\sql.txt and write below backup script in it:

USE master

GO

BACKUP DATABASE AdventureWorks

TO DISK = 'D:\SQL_Backup\AdventureWorks.bak' WITH INIT

Create another batch file for example Backup.bat and write the below statement inside it:

sqlcmd -S ServerName -U yourLogin -P yourPassowrd -i c:\sql.txt

Now we can execute this Backup.bat file from command prompt or can schedule using windows scheduler. Thus we have scheduled a task that is not dependent on SQL server Agent service.

Find who dropped, created or altered the table, SP or any object

Find who dropped, created or altered the table, SP or any object

If any database object is dropped, created or altered accidentally, sometimes you may need information about:

Who dropped, created or altered the object? When culprit not accept the mistake.

When the object was dropped, created or altered? Especially drop time of table is required for point in time recovery from database backups.

These changes are not recorded in SQL Server Error Log but are recorded in default trace. If you have not disabled the default trace and started looking into the issue soon after change occurred you could get this information. The path of trace file is “C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\Log\”. The folder MSSQL10.SQLEXPRESS may be different according to your SQL Server instance name. Here you would find 5 profiler trace files named as “log_1”, “Log_2”, etc. The file number is increased by time (in following example I used “log_16.trc”). Find the file that is most recently modified and use the below t-sql query to open that file:

SELECT ObjectName, DatabaseName, StartTime, NTDomainName, HostName, NTUserName, LoginName

FROM fn_trace_gettable('C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\Log\log_16.trc', default)

WHERE objectname is not null  


You can start a trace as default in two ways:

1. create a stored procedure that starts a trace# and then set that SP as startup as following:

CREATE PROC sp_StartTrace
AS
DBCC TRACEON (1204) 
GO

sp_procoption sp_StartTrace , 'STARTUP', 'ON'


2. Start SQL Server at Run window using NET START command with -T switch as below:
net start SQLSERVER -T 1204

SQL Server System Databases


SQL Server System Databases
  • Master
    • Purpose - Core system database to manage the SQL Server instance.  In SQL Server, the Master database is the logical repository for the system objects residing in the sys schema.  In SQL Server 2000 and previous editions of SQL Server, the Master database physically stored all of the system objects.
    • Prominent Functionality
      • Per instance configurations
      • Databases residing on the instance
      • Logins
      • Linked\Remote servers
      • Endpoints
    • Additional Information
      • The first database in the SQL Server startup process
      • In SQL Server 2005, needs to reside in the same directory as the Resource database
  • Resource
    • Purpose - The Resource database is responsible for physically storing all of the SQL Server 2005 system objects. This database has been created to improve the upgrade and rollback of SQL Server system objects with the ability to overwrite only this database.
      • Introduced in SQL Server 2005 to help manage the upgrade and rollback of system objects
      • Prior to SQL Server 2005 the system related data was stored in the master database
      • Read-only database that is not accessible via the SQL Server 2005 tool set
      • The database ID for the Resource database is 32767
      • The Resource database does not have an entry in master.sys.databases
  • TempDB
    • Purpose - Temporary database to store temporary tables (#temptable or ##temptable), table variables, cursors, work tables, row versioning, create or rebuild indexes sorted in TempDB, etc. Each time the SQL Server instance is restarted all objects in this database are destroyed, so permanent objects cannot be created in this database.
    • Each time a SQL Server instance is rebooted, the TempDB database is reset to its original state
  • Model
    • Purpose - Template database for all user defined databases
    • Additional Information
      • User defined tables, stored procedures, user defined data types, etc can be created in the Model database and will exist in all future user defined databases
      • The database configurations such as the recovery model for the Model database are applied to future user defined databases
  • MSDB
    • Purpose - Primary database to manage the SQL Server Agent configurations
    • Prominent Functionality
      • SQL Server Agent Jobs, Operators and Alerts
      • SSIS Package storage in SQL Server 2005,2008r2 and 2012
    • Additional Information
      • Provides some of the configurations for the SQL Server Agent service.
  • Distribution
    • Purpose - Primary data to support SQL Server replication
    • Prominent Functionality
      • Database responsible for the replication meta data
      • Supports the data for transaction replication between the publisher and subscriber(s)
      •  
  • ReportServer
    • Purpose - Primary database for Reporting Services to store the meta data and object definitions
  • ReportServerTempDB
    • Purpose - Temporary storage for Reporting Services
    • Prominent Functionality


How to Install SQL Server on Red Hat- Linux

The document for - how to  Install SQL Server on Red Hat -Linux       Download

Last cluster failover sql script to find out

--Last cluster failover sql script to find out

CREATE TABLE #ErrorLog(
LogDate DATETIME,

ErrorSource NVARCHAR(MAX),

ErrorMessage NVARCHAR(MAX)

)
CREATE TABLE #NumberOfLogs(

ID INT PRIMARY KEY NOT NULL,

LogDate DATETIME NOT NULL,

LogFileSize bigint
)
 
INSERT INTO #NumberOfLogs(ID,LogDate,LogFileSize)

EXEC master.dbo.xp_enumerrorlogs

DECLARE @ErrorLogID INT

DECLARE cNumberOfLogs CURSOR FOR

SELECT ID

FROM #NumberOfLogs

OPEN cNumberOfLogs

FETCH NEXT FROM cNumberOfLogs INTO @ErrorLogID

WHILE @@FETCH_STATUS = 0

BEGIN

INSERT INTO #ErrorLog(LogDate,ErrorSource,ErrorMessage)

EXEC sp_readerrorlog @ErrorLogID, 1, 'NETBIOS'

INSERT INTO #ErrorLog(LogDate,ErrorSource,ErrorMessage)

EXEC sp_readerrorlog @ErrorLogID, 1, 'SQL Server is terminating'

FETCH NEXT FROM cNumberOfLogs INTO @ErrorLogID

END

CLOSE cNumberOfLogs

DEALLOCATE cNumberOfLogs

SELECT LogDate, ErrorMessage FROM #ErrorLog

DROP TABLE #ErrorLog

DROP TABLE #NumberOfLogs

MySQL database migration from one server to another server.

Migrating a MySQL database from one server to another is a common DBA task, whether for hardware upgrades, disaster recovery, or server consolidation. In this guide, we will walk through the process of migrating a database from Testmysql01 to Testmysql02 and updating the web application accordingly.

MySQL database migration from one server to another server.

Connect to Testmysql01 using ssh

Take a dump of Test_database database

[root@Testmysql01 ~]# mysqldump -u root -p Test_database  > /opt/Test_database.sql

Copy the Dump file to Testmysql02

[root@Testmysql01 ~]# scp /opt/Test_database.sql root@Testmysql02.domain.com:/opt

[root@Testmysql01 ~]# Exit

Connect to Testmysql02 using ssh

connect to MySQL

[root@Testmysql02~]# MySQL -u root -p

Create Database and grant permission for the user

MySQL> create database Test_database;

MySQL> GRANT ALL ON Test_database.* TO testuser@'%' IDENTIFIED BY 'password';

MySQL> quit

Import Dump to new database

[root@Testmysql02~]# MySQL -u root -p Test_DBA < /opt/Test_DBA.sql

[root@Testmysql02~]# Exit

Connect to webserver using RDP.

Navigate to C:\inetpub\Test_database\Test_dat
abase\config

Edit file config.php and change 'dbhost' => in the file to Testmysql02.domain.com.

verify 'dbuser' => and 'dbpassword' => is defined correctly.

restart the site from IIS manager

connect to Test_database  site and verify everything is working fine.

Upgrading SQL Server 2014 Standard to Enterprise Edition

Upgrade SQL Server 2014 Standard to Enterprise document..          Download

Upgrading SQL Server 2014 Standard Edition to Enterprise Edition can unlock advanced features such as online indexing, advanced high availability, and enhanced performance. This guide provides a structured approach to ensure a smooth and successful upgrade.

Prerequisites

Before proceeding with the upgrade, ensure the following:

  • Backup: Take full database and system backups.

  • Check Compatibility: Verify application compatibility with Enterprise Edition features.

  • Disk Space: Ensure sufficient storage for the upgrade.

  • License Key: Have a valid Enterprise Edition license key.

  • System Requirements: Confirm that the system meets Enterprise Edition hardware requirements.

  • User Notifications: Inform stakeholders about potential downtime.

Step-by-Step Upgrade Process

Step 1: Launch SQL Server Setup

  1. Log in to the SQL Server host with administrative privileges.

  2. Insert the SQL Server 2014 Enterprise installation media or mount the ISO file.

  3. Run setup.exe from the installation media.

Step 2: Select Edition Upgrade Option

  1. In the SQL Server Installation Center, select Maintenance.

  2. Click Edition Upgrade.

Step 3: Validate Installed Instance

  1. The Edition Upgrade wizard will detect installed instances.

  2. Select the instance of SQL Server 2014 Standard that you want to upgrade.

  3. Click Next.

Step 4: Enter the Enterprise Edition Product Key

  1. Enter your valid Enterprise Edition product key.

  2. Click Next.

Step 5: Accept the License Terms

  1. Read the License Agreement.

  2. Accept the terms and click Next.

Step 6: Perform Rule Checks

  1. The setup will run pre-upgrade checks.

  2. Resolve any reported issues before proceeding.

  3. Click Next once all checks pass.

Step 7: Upgrade the Edition

  1. Click Upgrade to initiate the process.

  2. Wait for the upgrade to complete.

  3. Once completed, click Close.

Post-Upgrade Steps

Step 8: Verify Upgrade Success

  1. Open SQL Server Management Studio (SSMS).

  2. Run the following query to check the new edition:

    SELECT SERVERPROPERTY('Edition') AS Edition;
  3. The output should display Enterprise Edition.

Step 9: Restart SQL Services

  1. Open SQL Server Configuration Manager.

  2. Restart the SQL Server services to apply changes.

Step 10: Validate Application and Database Performance

  1. Test critical applications for compatibility.

  2. Check for any performance degradation.

  3. Monitor error logs for potential issues.

Step 11: Enable Enterprise Features (Optional)

  • Online Indexing

  • Partitioning

  • Data Compression

  • Advanced High Availability (AlwaysOn)

Upgrading SQL Server 2014 Standard to Enterprise Edition provides enhanced performance, scalability, and availability. Following this step-by-step guide ensures a smooth transition while minimizing risks. Always test in a non-production environment before upgrading a live system.

Additional Resources

Have you recently performed an SQL Server upgrade? Share your experience in the comments below!

Listing All Usernames and Roles for All Databases in SQL Server

As a SQL Server DBA, managing and auditing user roles and permissions across multiple databases is a critical task. Ensuring that each user has the appropriate access rights is essential for security and compliance. In this post, we’ll share a script that allows you to list all usernames and their associated roles across all databases in a SQL Server instance.

Why is This Important?

  • Security & Compliance: Regular audits help prevent unauthorized access.

  • Troubleshooting Access Issues: Quickly identify missing or incorrect permissions.

  • User Management: Helps maintain a structured approach to assigning roles and logins.

This script retrieves user information, including their associated roles, from all databases on a SQL Server instance. It works for different SQL Server versions and dynamically queries all databases using sp_MSForEachdb.

SQL Script: Listing Usernames and Roles


USE MASTER
GO
BEGIN
DECLARE @SQLVerNo INT;
SET @SQLVerNo = cast(substring(CAST(Serverproperty('ProductVersion') AS VARCHAR(50)) ,0,charindex('.',CAST(Serverproperty('ProductVersion') AS VARCHAR(50)) ,0)) as int);

IF @SQLVerNo >= 9
    IF EXISTS (SELECT TOP 1 * FROM Tempdb.sys.objects (nolock) WHERE name LIKE '#TUser%')
        DROP TABLE #TUser
ELSE
IF @SQLVerNo = 8
BEGIN
    IF EXISTS (SELECT TOP 1 * FROM Tempdb.dbo.sysobjects (nolock) WHERE name LIKE '#TUser%')
        DROP TABLE #TUser
END

CREATE TABLE #TUser (
    ServerName    varchar(256),
    DBName        SYSNAME,
    [Name]        SYSNAME,
    GroupName     SYSNAME NULL,
    LoginName     SYSNAME NULL,
    default_database_name  SYSNAME NULL,
    default_schema_name    VARCHAR(256) NULL,
    Principal_id  INT,
    [sid]         VARBINARY(85))

IF @SQLVerNo = 8
BEGIN
 INSERT INTO #TUser
 EXEC sp_MSForEachdb
 '
  SELECT
    @@SERVERNAME,
    ''?'' as DBName,
    u.name As UserName,
    CASE WHEN (r.uid IS NULL) THEN ''public'' ELSE r.name END AS GroupName,
    l.name AS LoginName,
    NULL AS Default_db_Name,
    NULL as default_Schema_name,
    u.uid,
    u.sid
  FROM [?].dbo.sysUsers u
    LEFT JOIN ([?].dbo.sysMembers m
    JOIN [?].dbo.sysUsers r
    ON m.groupuid = r.uid)
    ON m.memberuid = u.uid
    LEFT JOIN dbo.sysLogins l
    ON u.sid = l.sid
  WHERE u.islogin = 1 OR u.isntname = 1 OR u.isntgroup = 1
  ORDER BY u.name
 '
END

ELSE
IF @SQLVerNo >= 9
BEGIN
 INSERT INTO #TUser
 EXEC sp_MSForEachdb
 '
  SELECT
    @@SERVERNAME,
    ''?'',
    u.name,
    CASE WHEN (r.principal_id IS NULL) THEN ''public'' ELSE r.name END GroupName,
    l.name LoginName,
    l.default_database_name,
    u.default_schema_name,
    u.principal_id,
    u.sid
  FROM [?].sys.database_principals u
    LEFT JOIN ([?].sys.database_role_members m
    JOIN [?].sys.database_principals r
    ON m.role_principal_id = r.principal_id)
    ON m.member_principal_id = u.principal_id
    LEFT JOIN [?].sys.server_principals l
    ON u.sid = l.sid
  WHERE u.TYPE <> ''R''
  order by u.name
  '
END

SELECT *
FROM #TUser
ORDER BY DBName, [name], GroupName

DROP TABLE #TUser
END


How to Retrieve Disabled SQL Server Jobs

In SQL Server, SQL Agent Jobs play a crucial role in automating database maintenance tasks, backups, and other scheduled activities. However, sometimes jobs may be disabled due to administrative decisions, troubleshooting needs, or unexpected issues. As a DBA, it’s essential to track and manage these disabled jobs to ensure critical processes are not inadvertently left inactive.

In this blog post, we will look at a simple yet effective SQL query to retrieve a list of all disabled jobs in SQL Server.

Query to Fetch Disabled Jobs Below is a straightforward SQL query to identify all jobs that are currently disabled:

SELECT name
FROM msdb.dbo.sysjobs
WHERE enabled = 0
ORDER BY name;

Notes:

  • msdb.dbo.sysjobs: This system table stores metadata for all SQL Server Agent jobs.

  • enabled = 0: The enabled column indicates whether a job is active (1) or disabled (0). By filtering on 0, we retrieve only disabled jobs.

Automating the Monitoring Process To proactively monitor disabled jobs, consider setting up an automated alert or report. Here’s an approach using SQL Server Agent:

Create a SQL Server Agent Job

  • Schedule the above query to run at regular intervals.
  • Store the results in a table or send an email alert.

Using Database Mail for Notifications

DECLARE @body NVARCHAR(MAX);
SET @body = (SELECT STRING_AGG(name, ', ') FROM msdb.dbo.sysjobs WHERE enabled = 0);

EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'YourMailProfile',
    @recipients = 'dba_team@example.com',
    @subject = 'Disabled SQL Server Jobs Alert',
    @body = 'The following jobs are currently disabled: ' + @body;


Monitoring SQL Server Backup and Restore Progress

Managing database backups and restores is a critical aspect of SQL Server administration. When dealing with large databases, it becomes essential to track the progress of ongoing backup and restore operations to estimate completion time and monitor performance. This blog post provides a structured SQL script to monitor these operations effectively.

Why Monitor Backup and Restore Progress?

  • Ensures visibility into long-running operations

  • Helps estimate completion time for better planning

  • Identifies potential performance bottlenecks

  • Prevents unnecessary disruptions by avoiding premature interventions

SQL Script to Monitor Backup and Restore Progress Use the following SQL script to track the percentage completion, elapsed time, and estimated completion time of backup and restore operations in SQL Server:

SELECT

    r.session_id AS [Session_Id],

    r.command AS [Command],

    CONVERT(NUMERIC(6, 2), r.percent_complete) AS [% Complete],

    GETDATE() AS [Current Time],

    CONVERT(VARCHAR(20), DATEADD(ms, r.estimated_completion_time, GetDate()), 20) AS [Estimated Completion Time],

    CONVERT(NUMERIC(32, 2), r.total_elapsed_time / 1000.0 / 60.0) AS [Elapsed Min],

    CONVERT(NUMERIC(32, 2), r.estimated_completion_time / 1000.0 / 60.0) AS [Estimated Min],

    CONVERT(NUMERIC(32, 2), r.estimated_completion_time / 1000.0 / 60.0 / 60.0) AS [Estimated Hours],

    CONVERT(VARCHAR(1000), (

        SELECT SUBSTRING(TEXT, r.statement_start_offset / 2,

            CASE WHEN r.statement_end_offset = -1 THEN 1000

            ELSE (r.statement_end_offset - r.statement_start_offset) / 2 END)

        FROM sys.dm_exec_sql_text(sql_handle)

    )) AS [Statement Text]

FROM sys.dm_exec_requests r

WHERE r.command LIKE 'RESTORE%'

   OR r.command LIKE 'BACKUP%'

   OR r.command LIKE 'DbccFilesCompact'

   OR r.command LIKE 'DbccSpaceReclaim';

How to Verify SQL Server Backups with a Simple Query

Ensuring database backups are completed successfully is a critical task for every SQL Server DBA. In this post, I’ll share a SQL script that quickly checks the latest full backup status of all databases on a SQL Server instance.

SQL Script to Verify Backup Completion

  • The following script provides:
  • The server name
  • The database name
  • The last backup date
  • The backup status (Completed/Not Taken)
  • The backup file name


SET NOCOUNT ON SELECT 'SERVER NAME : ' + @@SERVERNAME SELECT SUBSTRING(s.name, 1, 40) AS 'Database Name', CAST(b.backup_start_date AS CHAR(25)) AS 'Last Backup Date', CASE WHEN b.backup_start_date > DATEADD(dd, -1, GETDATE()) THEN 'Backup Completed' WHEN b.backup_start_date > DATEADD(dd, -7, GETDATE()) THEN 'Not taken' ELSE 'Not taken' END AS 'Status', SUBSTRING(m.physical_device_name, 1, 100) AS 'Backup File Name' FROM master..sysdatabases s LEFT OUTER JOIN msdb..backupset b ON s.name = b.database_name AND b.backup_start_date = ( SELECT MAX(backup_start_date) FROM msdb..backupset WHERE database_name = b.database_name AND type = 'D' -- Full database backups only ) LEFT OUTER JOIN msdb..backupmediafamily m ON m.media_set_id = b.media_set_id AND m.physical_device_name = ( SELECT MAX(physical_device_name) FROM msdb..backupmediafamily WHERE media_set_id = b.media_set_id ) WHERE s.name <> 'tempdb' ORDER BY s.name


  • The script retrieves the most recent full backup (type = 'D') for each database.
  • It checks if the last backup was completed within the last 24 hours.
  • If no backup is found in the last 24 hours, it flags it as Not Taken.
  • The output includes the backup file name for easy tracking.
  • How to Remove Stuck SQL Server Services After a Failed Cluster Installation


    Problem:
    A friend encountered an issue while installing SQL Server in a clustered environment. The installation stopped midway, and he was unable to remove SQL Server using Add/Remove Programs or the SQL Server Setup. Even after manually deleting registry entries and folders, SQL Server services were still visible in Services.msc.

    Solution:
    If you face a similar issue, follow these steps to completely remove SQL Server services:

    Step 1: Delete SQL Server Services Using SC Command

    Open Command Prompt as Administrator and run the following commands:


    sc delete sqlserveragent sc delete mssqlserver

    This will remove the SQL Server Agent and SQL Server (MSSQLSERVER) services. If you are using a named instance, replace mssqlserver with mssql$<InstanceName>.

    Step 2: Delete SQL Server Services from Registry

    Since the services might still be registered in the Windows registry, follow these steps to clean up:

    1. Press Win + R, type regedit, and hit Enter.
    2. Navigate to the following path:

      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
    3. Look for entries related to SQL Server, such as:
      • MSSQLSERVER
      • SQLSERVERAGENT
      • MSSQL$InstanceName (for named instances)
    4. Right-click each SQL-related entry and Delete them.
    5. Close Registry Editor and restart the system.

    After performing these steps, the SQL Server services should be completely removed from the system.

    Granting VIEW DEFINITION and EXECUTE Permissions on All Stored Procedures in SQL Server

    Managing permissions effectively in SQL Server is crucial to maintaining security and access control. One common requirement is to grant users or groups the ability to view the definitions of stored procedures or execute them without giving broader privileges.

    In this post, we'll share SQL scripts that automate granting VIEW DEFINITION and EXECUTE permissions on all stored procedures in a given database.

    Granting VIEW DEFINITION Access

    The VIEW DEFINITION permission allows users to see the stored procedure’s definition without modifying it. Use the following script to generate and execute GRANT VIEW DEFINITION statements for all stored procedures:

    SELECT 'GRANT VIEW DEFINITION ON ' + QUOTENAME(specific_schema) + '.' + QUOTENAME(specific_name) + ' TO [Domain\\Ajeyudu]'

    FROM INFORMATION_SCHEMA.ROUTINES

    WHERE routine_type = 'PROCEDURE'

    Note: Replace [Domain\\Ajeyudu] with the actual user or group to whom you want to grant permissions.

    After running the above query, copy the generated GRANT VIEW DEFINITION statements and execute them.

    Granting EXECUTE Access

    To allow users to execute all stored procedures without requiring other permissions, use the script below:

    SELECT 'GRANT EXECUTE ON ' + QUOTENAME(specific_schema) + '.' + QUOTENAME(specific_name) + ' TO [Domain\\Ajeyudu]'

    FROM INFORMATION_SCHEMA.ROUTINES

    WHERE routine_type = 'PROCEDURE'

    Run the generated commands to apply EXECUTE permissions to the specified user or group.

    Automating the Permission Granting

    For larger databases, automating permission assignments via a dynamic SQL approach can be beneficial. Use the following script to execute the generated GRANT statements dynamically:

    DECLARE @sql NVARCHAR(MAX) = ''

    SELECT @sql = @sql + 'GRANT VIEW DEFINITION ON ' + QUOTENAME(specific_schema) + '.' + QUOTENAME(specific_name) + ' TO [Domain\\Ajeyudu];' + CHAR(13)

    FROM INFORMATION_SCHEMA.ROUTINES

    WHERE routine_type = 'PROCEDURE'

    EXEC sp_executesql @sql

    Similarly, modify the script for EXECUTE permissions:

    DECLARE @sql NVARCHAR(MAX) = ''

    SELECT @sql = @sql + 'GRANT EXECUTE ON ' + QUOTENAME(specific_schema) + '.' + QUOTENAME(specific_name) + ' TO [Domain\\Ajeyudu];' + CHAR(13)

    FROM INFORMATION_SCHEMA.ROUTINES

    WHERE routine_type = 'PROCEDURE'

    EXEC sp_executesql @sql

    By using dynamic SQL, these scripts can directly apply permissions without requiring manual execution of individual statements.