No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Triggers a nivel administrativo

15/31
Recursos

Aportes 13

Preguntas 5

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

🎉🔥Yo creo este ejemplo de un trigger donde cada vez que se insertara un usuario me iba a llegar un correo en tabla de cada usuario registrado, para esto el requerimiento es haber configurado si o si sp_send_dbmail y agregarle los parametros en donde se ejecuta el profile y el correo 💚ya agregue una columna llamada load_date para verificar el ultimo(s) usuarios nuevos dentro de la tabla UsuarioTarget

CREATE TRIGGER [dbo].[send_email_insert_usuario_new]
ON [dbo].[UsuarioTarget]
FOR INSERT
AS
BEGIN
    SET NOCOUNT ON;
	SET ANSI_WARNINGS OFF
	DECLARE @database NVARCHAR(MAX) = N''
	DECLARE @tableHTML nvarchar(max)
	DECLARE @Table NVARCHAR(MAX) = N''
	DECLARE @subject_content NVARCHAR(MAX) = N''

	SELECT @Table = @Table +'<tr style="background-color:'+CASE WHEN (ROW_NUMBER() OVER (ORDER BY id))%2 =1 THEN '#A3E0FF' ELSE '#8ED1FB' END +';">' +
'<td>' + CAST(CONVERT(varchar, CAST(RTRIM((id)) AS varchar), 1) AS varchar) + '</td>' +
'<td>' + CAST(CONVERT(varchar, CAST(RTRIM((name)) AS varchar), 1) AS varchar) + '</td>' +
'<td>' + CAST(CONVERT(varchar, CAST((load_date) AS date), 1) AS varchar) + '</td>'  + '</tr>'
FROM [dbo].UsuarioTarget 
WHERE (load_date > GETDATE() - 1) 

select @database  = (select DB_NAME() AS [Current Database])

SET @subject_content = 'User Record Inserted in ' + @database

SET @tableHTML = 
N'<H3>Catalogue Users</H3>' +
N'<table border="1" align="center" cellpadding="2" cellspacing="0" style="font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;text-align:center; border-collapse: collapse; width: 100%;" >' +
N'<tr style ="font-size: 14px;font-weight: normal;background: #b9c9fe;">
<th>User ID</th>
<th>Name User</th>
<th>Date</th>' + @Table  + N'</table>' + N'<br>' + N'<br>' 

print @database

    IF EXISTS (SELECT MAX(load_date) FROM UsuarioTarget )
    BEGIN
        EXEC msdb.dbo.sp_send_dbmail
          @recipients = '[email protected]', 
          @profile_name = 'Email',
          @subject = @subject_content,
          @body = @tableHTML,
		  @body_format = 'HTML' ;
    END
END
go

Que poderoso pueden ser los triggers de lado de la administración de servers para Base de Datos.

Los triggers nos facilitan la vida. Los usaré de manera más seguida. 😄

En nuestra empresa se crean triggers de servidor, para mejorar la seguridad de acceso. Se valida, servidor, programa donde se ejecuta. Este es un ejemplo, ell de nuestra empresa es mucho más complejo y genera auditoria adicional.

CREATE TRIGGER strRejectSSMSConnectionForSQLLogin1
ON ALL SERVER FOR LOGON
AS
BEGIN

    IF ORIGINAL_LOGIN() = N'SQLLogin1' AND PROGRAM_NAME() LIKE N'Microsoft SQL Server Management Studio%'
    BEGIN
        RAISERROR('Direct connection by SSMS refused.', 16, 1)
        ROLLBACK
    END

END

https://dba.stackexchange.com/questions/231228/how-to-deny-access-to-sql-server-to-certain-login-over-ssms-but-allow-over-net

Creo que este ejemplo de uso de triggers a nivel BD no es muy práctico. Ya que estas haciendo lo que se puede hacer mediante los permisos. Un mejor ejemplo seria que mande notificaciones cada que creen,modifiquen o eliminen algun objeto los que tienen el permiso.

Normalmente había considerado los triggers solo para cuestiones relacionadas con tablas de información, no tanto para cuestiones administrativas. Me resulta muy interesante las aplicaciones adicionales que pueden tener.

Las ultimas clases si están muy interesantes, y mas con el uso de los triggers para tener mas control como administrador.

en mi trabajo hacen esas restricciones a nivel de permisos del usuario, solo hay un usuario dba que puede crear, y los demas solo pueden consultar e insertar y cada usuario tiene permiso a ciertas tablas por el rol… base de datos ORACLE

MI ejemplo del Alter Update y el Insert:

ALTER TRIGGER T_Insert
ON UsuarioTarget
AFTER INSERT
AS
BEGIN
IF (ROWCOUNT_BIG() = 0)
RETURN;
DECLARE @codigo int
SELECT @codigo = codigo from inserted
IF @codigo = 7
BEGIN
Print 'No se realizo el Insert’
ROLLBACK;
RETURN;
END

–SELECT Codigo,Nombre,Puntos
–FROM INSERTED
Print 'Se realizo el insert’
END
GO

ALTER TRIGGER T_Update
ON UsuarioTarget
AFTER UPDATE
AS
BEGIN
IF (ROWCOUNT_BIG() = 0)
RETURN;
DECLARE @codigo int
SELECT @codigo = codigo from inserted
IF @codigo = 7
BEGIN
Print 'No se realizo el Update’
ROLLBACK;
RETURN;
END
–SELECT Codigo,Nombre,Puntos
–FROM INSERTED
Print 'Se realizo el Update’
END
GO

No tenía presente el uso de los trigger, por ahora entiendo que se puede controlar errores, usar para temas administrativos; Se debe tener cuidado con el uso de ellos.

El uso inadecuado o excesivo de los triggers puede disminuir considerablemente el rendimiento de la base de datos. Hay que tener cuidado de no usarlos indiscriminadamente

La ruta para encontrar los trigger de bases de datos es:
Databases / Nombre de la BD (Platzi) / Programmability / Database Triggers

Triggers administrativos.

-- Trigger on a CREATE, ALTER, DROP, GRANT, DENY, 
-- REVOKE or UPDATE statement (DDL Trigger)  
  
CREATE [ OR ALTER ] TRIGGER trigger_name   
ON { ALL SERVER | DATABASE }   
[ WITH <ddl_trigger_option> [ ,...n ] ]  
{ FOR | AFTER } { [event_type] | event_group } [ ,...n ]  
AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }  
  
<ddl_trigger_option> ::=  
    [ ENCRYPTION ]  
    [ EXECUTE AS Clause ]

event_type
event_group