As best practice it is recommended to disable guest user in every user database, i.e. not master, msdb and tempdb, to improve the security of SQL Server. Guest user permits access to a database for any logins that are not mapped to a specific database user. The guest user cannot be dropped but it can be disabled by revoking the CONNECT permission.
Use the script below to identify which databases have guest user enabled.
USE master; GO DECLARE @database_name SYSNAME ,@sqlcmd NVARCHAR(4000) DECLARE databases_cursor CURSOR FOR SELECT NAME FROM sys.databases WHERE STATE IN (0) AND database_id > 4 ORDER BY NAME CREATE TABLE #guest_users_enabled ( database_name SYSNAME ,user_name SYSNAME ,permission_name NVARCHAR(128) ,state_desc NVARCHAR(6) ) OPEN databases_cursor; FETCH NEXT FROM databases_cursor INTO @database_name; WHILE @@FETCH_STATUS = 0 BEGIN SET @sqlcmd = N'use ' + @database_name + '; insert into #guest_users_enabled SELECT ''' + @database_name + ''' as database_name, name, permission_name, state_desc FROM sys.database_principals dpr INNER JOIN sys.database_permissions dpe ON dpr.principal_id = dpe.grantee_principal_id WHERE name = ''guest'' AND permission_name = ''CONNECT''' EXEC sp_executesql @sqlcmd FETCH NEXT FROM databases_cursor INTO @database_name; END SELECT database_name ,user_name ,permission_name ,state_desc FROM #guest_users_enabled ORDER BY database_name ASC DROP TABLE #guest_users_enabled CLOSE databases_cursor; DEALLOCATE databases_cursor; GO
Use the script below, changing the placeholder database with the database identified in the script above, to revoke permission for the guest user to connect to that database.
USE [database name]; GO REVOKE CONNECT FROM GUEST; GO