Si trabajas con SQL Server en entornos productivos, dominar la administración de permisos y el monitoreo es clave para mantener la seguridad, estabilidad y rendimiento del sistema.
En este artículo encontrarás desde comandos básicos hasta ejemplos más avanzados utilizados en escenarios reales.
🔐 Gestión de permisos (Nivel básico)
Dar permiso CONNECT en la base de datos
USE NombreBaseDatos;
GO
GRANT CONNECT TO NombreUsuario;
Permitir ver los Stored Procedures
GRANT VIEW DEFINITION ON DATABASE::TuBaseDeDatos TO TuUsuario;
Permitir ver el código de los SPs
GRANT VIEW DEFINITION TO TuUsuario;
Dar permiso EXECUTE sobre el esquema dbo o base de datos
GRANT EXECUTE ON SCHEMA::dbo TO NombreUsuario;
GRANT EXECUTE ON DATABASE::TuBaseDeDatos TO NombreUsuario;
Permisos sobre tablas o vistas específicas
GRANT SELECT ON dbo.MiTabla TO NombreUsuario;
GRANT INSERT, UPDATE, DELETE ON dbo.MiTabla TO NombreUsuario;
GRANT SELECT ON dbo.MiVista TO NombreUsuario;
Acceso completo sobre un esquema
GRANT SELECT ON SCHEMA::dbo TO NombreUsuario;
GRANT INSERT, UPDATE, DELETE ON SCHEMA::dbo TO NombreUsuario;
🔐 Gestión avanzada de seguridad
Crear Login (nivel servidor)
CREATE LOGIN MiLogin WITH PASSWORD = 'PasswordSeguro123!';
Crear Usuario en la base de datos
USE NombreBaseDatos;
CREATE USER MiUsuario FOR LOGIN MiLogin;
Asignar roles predefinidos
ALTER ROLE db_datareader ADD MEMBER MiUsuario;
ALTER ROLE db_datawriter ADD MEMBER MiUsuario;
Crear un rol personalizado
CREATE ROLE RolLecturaEscritura;
GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::dbo TO RolLecturaEscritura;
ALTER ROLE RolLecturaEscritura ADD MEMBER MiUsuario;
Revocar permisos (REVOKE vs DENY)
-- Revoca el permiso (lo quita si existe)
REVOKE SELECT ON dbo.MiTabla FROM MiUsuario;
-- Deniega explícitamente (tiene mayor prioridad)
DENY SELECT ON dbo.MiTabla TO MiUsuario;
💡 Tip importante: DENY siempre tiene prioridad sobre GRANT.
Ejecutar como otro usuario (testing de seguridad)
EXECUTE AS USER = 'MiUsuario';
SELECT * FROM dbo.MiTabla;
REVERT;
📊 Monitoreo y diagnóstico
Que privilegios tiene un usuario
SELECT
dp.name AS Usuario,
dp2.name AS Objeto,
perm.permission_name,
perm.state_desc
FROM sys.database_permissions perm
JOIN sys.database_principals dp
ON perm.grantee_principal_id = dp.principal_id
LEFT JOIN sys.objects dp2
ON perm.major_id = dp2.object_id
WHERE dp.name = 'TuUsuario';
A que roles pertenece un usuario
SELECT
member.name AS Usuario,
role.name AS Rol
FROM sys.database_role_members drm
JOIN sys.database_principals role
ON drm.role_principal_id = role.principal_id
JOIN sys.database_principals member
ON drm.member_principal_id = member.principal_id
WHERE member.name = 'TuUsuario';
Uso de índices y tablas
SELECT
DB_NAME(database_id) AS BaseDeDatos,
OBJECT_NAME(i.object_id) AS Objeto,
last_user_seek,
last_user_scan,
last_user_lookup,
last_user_update
FROM sys.dm_db_index_usage_stats s
JOIN sys.indexes i
ON s.object_id = i.object_id AND s.index_id = i.index_id
WHERE database_id = DB_ID('TuBaseDeDatos')
ORDER BY
COALESCE(last_user_seek, last_user_scan, last_user_lookup, last_user_update) DESC;
Consultas más costosas (performance tuning)
SELECT TOP 10
qs.total_elapsed_time / qs.execution_count AS AvgElapsedTime,
qs.execution_count,
qs.total_logical_reads,
qt.text
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY AvgElapsedTime DESC;
Bloqueos activos
SELECT
blocking_session_id,
session_id,
wait_type,
wait_time,
wait_resource
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0;
Sesiones activas
SELECT
session_id,
login_name,
status,
host_name,
program_name
FROM sys.dm_exec_sessions
WHERE is_user_process = 1;
Actividad con Default Trace
SELECT *
FROM fn_trace_gettable(
(SELECT TOP 1 path FROM sys.traces WHERE is_default = 1),
DEFAULT
)
WHERE DatabaseName = 'TuBaseDeDatos'
ORDER BY StartTime DESC;
🧠 Buenas prácticas
- Usa roles en lugar de permisos directos a usuarios
- Evita usar
dbopara todo, segmenta por esquemas - Aplica el principio de mínimos privilegios
- Audita accesos periódicamente
- Documenta cambios de seguridad
🚀 Conclusión
Estos comandos te permiten:
- Administrar accesos de forma segura
- Diagnosticar problemas de rendimiento
- Identificar bloqueos y uso de recursos
- Prepararte para escenarios reales en producción
Dominar estos scripts es clave para cualquier desarrollador backend o líder técnico que trabaje con SQL Server.
📌 Si te fue útil, considera guardar este artículo o compartirlo con tu equipo.