SQL Server: Comandos de Administración más utilizados (Permisos, Seguridad y Monitoreo)

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 dbo para 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.