No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Triggers a nivel administrativo

15/31
Recursos

Aportes 12

Preguntas 5

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

馃帀馃敟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.

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

鈥揝ELECT Codigo,Nombre,Puntos
鈥揊ROM 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
鈥揝ELECT Codigo,Nombre,Puntos
鈥揊ROM 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