Triggers, procedimientos y nombre de la sesión en SQL Server

como estoy en entrenamiento en XMS con todo lo que tiene que ver con SQL y BI me pidieron que que hiciera lo siguiente:

  •  Hacer triggers  para insert,update y delete
  •  Hacer un trigger que registre cuando se ejecuto una sentencia sql y cual fue la sesión que la ejecuto
  • Hacer procedimientos almacenados para insertar,borrar y modificar la auditoria


1.- Para que a alguien le toque algo similar y no pierda su tiempo averiguando aquí yo hice algo así.Primero creamos las la base de datos contonso, con la tabla employee y salary:
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

--creamos la base de datos
CREATE DATABASE contoso
GO

--usamos la base de datos
USE contoso  GO

CREATE TABLE employee(
  ID          INT
, name        VARCHAR(10)
, salary      INT
, start_date DATETIME
, city        VARCHAR(10)
, region      char(1))
GO

CREATE TABLE salary(
  region char(1)
, city VARCHAR(10)
, sum_salary INT )
GO

 CREATE TABLE  Auditors(
  ID INT
, Fecha_Creacion datetime
, Login nvarchar(50))
GO 

--datos de prueba 
insert into employee (ID, name,    salary, start_date, city,region)
values (1,  'Jason', 40420,  '02/01/94', 'New York', 'W');
insert into employee (ID, name,    salary, start_date, city,region)
values (2,  'Robert',14420,  '01/02/95', 'Vancouver','N');
insert into employee (ID, name,    salary, start_date, city,region)
values (3,  'Celia', 24020,  '12/03/96', 'Toronto',  'W');
insert into employee (ID, name,    salary, start_date, city,region)
values (4,  'Linda', 40620,  '11/04/97', 'New York', 'N');


CREATE TRIGGER salario
ON  employee
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;

Declare @salario int
Declare @region char(1)
Declare @city   varchar(10)
Declare @region_test char(1)

Select @salario = (Select [salary] From Inserted)
Select @region  = (Select  [region] From Inserted)
SELECT @city = (select [city] From Inserted)
Select @region_test =(Select  [region] From [dbo].[salary] where @region=[region])
if @region_test is  NULL
INSERT INTO [dbo].[salary] ([region],[city],[sum_salary]) VALUES(@region,@city,@salario)
ELSE
update [dbo].[salary] set [sum_salary]= [sum_salary]+@salario where [region]=@region

END
GO

CREATE TRIGGER nuevo_salario
ON  employee
AFTER update
AS 
BEGIN  
SET NOCOUNT ON
Declare @salario_nuevo int
Declare @salario_viejo int
Declare @region char(1)
Declare @diferencia int

Select @region  = (Select  [region] From Inserted)
Select @salario_nuevo = (Select [salary] From Inserted)
Select @salario_viejo = (Select [salary] From deleted)
SET @diferencia= @salario_nuevo - @salario_viejo
update [dbo].[salary] set [sum_salary]= [sum_salary]+@diferencia where [region]=@region
END
GO

CREATE TRIGGER despedido
ON  employee
AFTER delete
AS
BEGIN     
SET NOCOUNT ON
Declare @salario_despedido int
Declare @region char(1)
Select @region  = (Select  [region] From deleted)
Select @salario_despedido = (Select [salary] From deleted)
update [dbo].[salary] set [sum_salary]= [sum_salary]-@salario_despedido where [region]=@region
END
GO

--para auditar
CREATE TRIGGER [dbo].[audit] ON  [dbo].[Test]
AFTER INSERT
AS 
BEGIN
Declare @id int 
set @id=(Select ID from inserted)

insert into [dbo].[Auditor]([ID],[Fecha_Creacion],[Login]) values(@id,Getdate(),ORIGINAL_LOGIN( ))
END
GO

--Insertar en la tabla dado como parámetro el valor que tiene
CREATE PROCEDURE  addrow @id int,@fecha datetime , @usuario nvarchar(50) AS
insert into Auditor([ID],[Fecha_Creacion],[Login]) values(@id,@fecha,@usuario)
GO 

--Borra un registro de la tabla dado el ID
CREATE PROCEDURE  delrow @id int as delete  from [dbo].[Auditor] where ID=@ID
GO

--Actualizar el valor de la tabla
CREATE PROCEDURE uprow @id int,@usuario nvarchar(50) AS
Declare @num int
IF EXISTS (SELECT * FROM [dbo].[Auditor] WHERE ID = @id)
BEGIN
update [dbo].[Auditor] set [Login]=@usuario where ID=@id
set @num=(select count(ID)  from [dbo].[Auditor] where ID=@id)
select 'Fueron afectadas un total de '+ cast(@num as varchar)+' Columna(s)'
END
ELSE
select 'El ID No Existe'
G0

--Ejemplo de Como Usarlo
exec addrow 1,'2012-05-24 17:23:57.967','MiDominio\PINTOLAND'

No comments: