Hola, justo en esta parte del foro encontre unos triggers de DDL y de logon, lo que necesito es implementar un trigger a nivel de tabla y que me tome los datos de EVENTDATA, hice las pruebas en SQL 2005 y me devuelve NULL nomas, yo quiero para cada operacion que hago en una tabla X guarde en la tabla bitacora entre otros campos le IP desde donde se ejecuto el camio, para ello uso algo como esto
DECLARE @IP Varchar(500)
SET @IP = EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'varchar(500)')
dentro del trigger pero solo me devuelve NULL, esto del EVENTDATA por ahi lei que solo funciona en triggers de logon y server, es esto cierto??, en todo caso que funcion me sugieren usar pues en mi tabla bitacora quiero guardar el comando ejecutado,l a IP de donde se ejecuto, entre otros datos, pero estos dos son los mas trascendentes,. Agradecere me puedan dar luz en este asunto que me estoy complicando en demasia :-)
Hola como estas !, el tema de la función EVENTDATA es utilizado para todo lo que sea DDL y logon al servidor SQL 2005. En el caso que quieras implementarlo cada vez que ejecuten un ALTER TABLE - CREATE TABLE, tenes que tener en cuenta que podrás contar con los siguientes atributos:
Otra opción es que implementes trazas para capturar la información que necesitas, para ello te sugiero que comiences con los stores procedures y función que te detallo a continuación:
Stores Procedures para generación y captura de datos:
Hola que tal,tengo un problemilla,tengo un stored en sql 05 encriptadoque funciona bien,pero en otra base se desencripto el mismo stored por medio del sql decryptor y ya no funciona bien. Lo que necesito es poder copiar el stored encriptado a otra base.(no necesito des encriptarlo solo ponerlo en la otra base). Me podran a yudar a saber como paso el stored encriptado a otra base.??
Hola bammbataa !, mira simplemente tenes que posicionarte en la base de origen y stored procedure encriptado, luego realizas un "generate script" del objeto y el resultado (que lo vas a ver encriptado) lo ejecutas en la base de destino. Así te tendría que funcionar bien.
Hola como estas ! bueno te comento, según la version del dbms que estes usando es la solución, fijate y comentame.
PARA SQL2000
USE [BaseXQUERY]
GO
CREATE TABLE [dbo].[t1](
[c1] [varchar](255) NULL,
[c2] [int] NULL
) ON [PRIMARY]
GO
EXEC sp_grantdbaccess pepe,pepe
EXEC sp_addrolemember N'db_datareader', N'pepe';
GO
GRANT CREATE TABLE TO pepe;
GO
PRUEBA A REALIZAR
Te logueas como pepe.
create table #t2 (c1t char(10),c2t char(10))
insert into #t2 select * from t1
select * from #t2
drop table #t2
delete from t1
update t1 set c1 = null
SALIDA:
ab 1
cd 2
ef 3
(3 row(s) affected)
(3 row(s) affected)
Server: Msg 229, Level 14, State 5, Line 1
DELETE permission denied on object 't1', database 'BaseXQUERY', owner 'dbo'.
Server: Msg 229, Level 14, State 5, Line 1
UPDATE permission denied on object 't1', database 'BaseXQUERY', owner 'dbo'.
PARA SQL2005
USE [BaseXQUERY]
GO
EXEC sp_addrolemember N'db_datareader', N'pepe';
GO
GRANT ALTER ON SCHEMA::[dbo] TO [pepe];
GO
GRANT CREATE TABLE TO Pepe;
GO
PRUEBA
Te logueas como pepe.
create table #t2 (c1t char(10),c2t char(10))
insert into #t2 select * from t1
select * from #t2
drop table #t2
delete from t1
update t1 set c1 = null
SALIDA:
(3 row(s) affected)
c1t c2t
---------- ----------
AB 1
AC 2
ZZ 3
(3 row(s) affected)
Msg 229, Level 14, State 5, Line 5
The DELETE permission was denied on the object 't1', database 'BaseXQUERY', schema 'dbo'.
Msg 229, Level 14, State 5, Line 6
The UPDATE permission was denied on the object 't1', database 'BaseXQUERY', schema 'dbo'.
Quisiera saber como se puede restringir el acceso al motor de base de datos a los usuarios de la red, ni instalando el sql server en la terminal de trabajo ni ninguna otra aplicacion de acceso a bases de datos. Esto para evitar manipulacion indebida de la informacion almacenada.
Hola !, con respecto a la seguridad tenes tres niveles a tener en cuenta:
Nivel 1: Cerrar seguridad en la red
Nivel 2: Cerrar seguridad en el dbms, en este caso SQL Server
Nivel 3: Cerrar la seguridad en la aplicaciones.
Te detallo en rasgos generales cada nivel:
Nivel 1) Se refiere a la seguridad física (Sala de servidores) y seguridad lógica entre ellos configuración de firewall, encriptación de datos a través de los routers, no asignar privilegios adm a los usuarios finales en sus wks, etc.
Nivel 2) Se refiere a la configuración interna del SQL Server:
Solo autenticación trusted (AD de Windows).
Eliminar el grupo Builtin Administrators.
Generar un grupo global para asignación de usuarios como sysadmin del SQL.
Usuarios como dbowner de las bases, solo para las aplicaciones que explícitamente los necesiten.
Relacionado al punto anterior generar una cuenta aplicación en AD para que solo ella pueda acceder con esos privilegios a través de la APP.
Nivel 3) Se refiere al diseño de las aplicaciones.
Definir un usuario aplicación del tipo trusted (usuario windows) para acceso a la base. (Hereda todos las políticas aplicadas, por ej: política de complejidad de contraseña)
Acceder a los datos a través del usuario aplicación, mediante stored procedures y vistas.
Trabajar con roles de base de datos si es necesario.
Dbowner de las bases restringir lo máximo posible. (granularidad de permisos).
Tratar de revocar permisos sobre los stored procedures extendidos (xp_...).
Para todos los niveles, es recomendable guardar auditoria y realizar monitoreos mediante alertas (Por ej: SCOM o en su vieja version MOM).
Tenes un articulo muy bueno en ntro sitio al cual podes echar un vistazo.
En el log de sql2005, me deja el siguiente texto si se borra una base de datos:
2009-10-07 11:25:13.06 spid54 SQL Server has encountered 2 occurrence(s) of cachestore flush for the 'Object Plans' cachestore (part of plan cache) due to some database maintenance or reconfigure operations.
2009-10-07 11:25:13.07 spid54 SQL Server has encountered 2 occurrence(s) of cachestore flush for the 'SQL Plans' cachestore (part of plan cache) due to some database maintenance or reconfigure operations.
2009-10-07 11:25:13.07 spid54 SQL Server has encountered 2 occurrence(s) of cachestore flush for the 'Bound Trees' cachestore (part of plan cache) due to some database maintenance or reconfigure operations.
Como puedo saber el nombre de la base de datos borrada???.
Muchas gracias, Paco
Hola Paco como estas !, bueno, seguramente utilizaste el wizard o ayudante de SQL Server para generar un plan de mantenimiento de base de datos, es por ello que cada vez que se elimina una base de datos, te queden jobs apuntando a la base borrada. Lo primero que haría es chequear la salida de todos los jobs agendados en el sql server, para ver errores y warning.
Con respecto a como saber cual es la base de datos borrada es muy sencillo:
1) Query para listar base de datos:
select dbid,dbname from sysdatabases;
2) Buscar por el errorlog de SQL server los siguientes string:
deleted database
drop database
removed database
3) Para determinar en tiempo de ejecución que aplicacion o usuario puede estar borrando una base de datos, levanta un Profiler de SQL Server y graba en una tabla o archivo para almacenar y luego realizar la búsqueda.
Hola Victor como estas !, te comento, en versiones 2005 y superior lo podes encarar a través de DML TRIGGERS, para las operaciones de DELETE sobre la tabla afectada.
Para poder registrar y leer la actividad deberías crear una tabla en la misma base de datos o bien en otra tipo de auditoria, donde el trigger realice un insert a la misma, con los datos de usuario y registro.
Puedes utilizar las funciones SESSION_USER (Transact-SQL), USER_NAME,SUSER_SNAME para determinar el usuario y GETDATE() fecha y hora entre otras funciones.
Resumiendo:
TRIGGERS DML, FUNCIONES y TABLAS de auditoria.
Comentarios
Hola, justo en esta parte del foro encontre unos triggers de DDL y de logon, lo que necesito es implementar un trigger a nivel de tabla y que me tome los datos de EVENTDATA, hice las pruebas en SQL 2005 y me devuelve NULL nomas, yo quiero para cada operacion que hago en una tabla X guarde en la tabla bitacora entre otros campos le IP desde donde se ejecuto el camio, para ello uso algo como esto
DECLARE @IP Varchar(500)
SET @IP = EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'varchar(500)')
dentro del trigger pero solo me devuelve NULL, esto del EVENTDATA por ahi lei que solo funciona en triggers de logon y server, es esto cierto??, en todo caso que funcion me sugieren usar pues en mi tabla bitacora quiero guardar el comando ejecutado,l a IP de donde se ejecuto, entre otros datos, pero estos dos son los mas trascendentes,. Agradecere me puedan dar luz en este asunto que me estoy complicando en demasia :-)
Saludos
Solo se que nada se
Hola como estas !, el tema de la función EVENTDATA es utilizado para todo lo que sea DDL y logon al servidor SQL 2005. En el caso que quieras implementarlo cada vez que ejecuten un ALTER TABLE - CREATE TABLE, tenes que tener en cuenta que podrás contar con los siguientes atributos:
EVENT_INSTANCE
EventType
PostTime
SPID
ServerName
LoginName
UserName
DatabaseName
SchemaName
ObjectName
ObjectType
TSQLCommand
EVENT_INSTANCE
Otra opción es que implementes trazas para capturar la información que necesitas, para ello te sugiero que comiences con los stores procedures y función que te detallo a continuación:
Stores Procedures para generación y captura de datos:
sp_trace_create
sp_trace_setevent
sp_trace_setstatus
sp_trace_generateevent
Función para transformar y leer los datos capturados:
fn_trace_getinfo
Saludos. :-)
Prodriguez
Quiero aprender SQL y obtener ayuda a problemas que me han estado sucecediendo.
Hola que tal,tengo un problemilla,tengo un stored en sql 05 encriptadoque funciona bien,pero en otra base se desencripto el mismo stored por medio del sql decryptor y ya no funciona bien. Lo que necesito es poder copiar el stored encriptado a otra base.(no necesito des encriptarlo solo ponerlo en la otra base). Me podran a yudar a saber como paso el stored encriptado a otra base.??
Gracias
Hola bammbataa !, mira simplemente tenes que posicionarte en la base de origen y stored procedure encriptado, luego realizas un "generate script" del objeto y el resultado (que lo vas a ver encriptado) lo ejecutas en la base de destino. Así te tendría que funcionar bien.
Espero tus comentarios.
Saludos virtuales.
Hola a todos ! necesito que me ayuden:
Existe algún perfil que se le pueda dar a alguien para leer TODO y SOLO crear, pero NO quiero que puedan modificar nada.
¿Es esto posible?
Gracias de antemano.
Marqui.
Hola como estas ! bueno te comento, según la version del dbms que estes usando es la solución, fijate y comentame.
PARA SQL2000
USE [BaseXQUERY]
GO
CREATE TABLE [dbo].[t1](
[c1] [varchar](255) NULL,
[c2] [int] NULL
) ON [PRIMARY]
GO
EXEC sp_grantdbaccess pepe,pepe
EXEC sp_addrolemember N'db_datareader', N'pepe';
GO
GRANT CREATE TABLE TO pepe;
GO
PRUEBA A REALIZAR
Te logueas como pepe.
create table #t2 (c1t char(10),c2t char(10))
insert into #t2 select * from t1
select * from #t2
drop table #t2
delete from t1
update t1 set c1 = null
SALIDA:
ab 1
cd 2
ef 3
(3 row(s) affected)
(3 row(s) affected)
Server: Msg 229, Level 14, State 5, Line 1
DELETE permission denied on object 't1', database 'BaseXQUERY', owner 'dbo'.
Server: Msg 229, Level 14, State 5, Line 1
UPDATE permission denied on object 't1', database 'BaseXQUERY', owner 'dbo'.
PARA SQL2005
USE [BaseXQUERY]
GO
EXEC sp_addrolemember N'db_datareader', N'pepe';
GO
GRANT ALTER ON SCHEMA::[dbo] TO [pepe];
GO
GRANT CREATE TABLE TO Pepe;
GO
PRUEBA
Te logueas como pepe.
create table #t2 (c1t char(10),c2t char(10))
insert into #t2 select * from t1
select * from #t2
drop table #t2
delete from t1
update t1 set c1 = null
SALIDA:
(3 row(s) affected)
c1t c2t
---------- ----------
AB 1
AC 2
ZZ 3
(3 row(s) affected)
Msg 229, Level 14, State 5, Line 5
The DELETE permission was denied on the object 't1', database 'BaseXQUERY', schema 'dbo'.
Msg 229, Level 14, State 5, Line 6
The UPDATE permission was denied on the object 't1', database 'BaseXQUERY', schema 'dbo'.
Exitos totales !!!!!!.
Prodriguez
Buenas noches a todos.
Quisiera saber como se puede restringir el acceso al motor de base de datos a los usuarios de la red, ni instalando el sql server en la terminal de trabajo ni ninguna otra aplicacion de acceso a bases de datos. Esto para evitar manipulacion indebida de la informacion almacenada.
Muchisimas gracias por su colaboracion...
Hola !, con respecto a la seguridad tenes tres niveles a tener en cuenta:
Nivel 1: Cerrar seguridad en la red
Nivel 2: Cerrar seguridad en el dbms, en este caso SQL Server
Nivel 3: Cerrar la seguridad en la aplicaciones.
Te detallo en rasgos generales cada nivel:
Nivel 1) Se refiere a la seguridad física (Sala de servidores) y seguridad lógica entre ellos configuración de firewall, encriptación de datos a través de los routers, no asignar privilegios adm a los usuarios finales en sus wks, etc.
Nivel 2) Se refiere a la configuración interna del SQL Server:
Solo autenticación trusted (AD de Windows).
Eliminar el grupo Builtin Administrators.
Generar un grupo global para asignación de usuarios como sysadmin del SQL.
Usuarios como dbowner de las bases, solo para las aplicaciones que explícitamente los necesiten.
Relacionado al punto anterior generar una cuenta aplicación en AD para que solo ella pueda acceder con esos privilegios a través de la APP.
Nivel 3) Se refiere al diseño de las aplicaciones.
Definir un usuario aplicación del tipo trusted (usuario windows) para acceso a la base. (Hereda todos las políticas aplicadas, por ej: política de complejidad de contraseña)
Acceder a los datos a través del usuario aplicación, mediante stored procedures y vistas.
Trabajar con roles de base de datos si es necesario.
Dbowner de las bases restringir lo máximo posible. (granularidad de permisos).
Tratar de revocar permisos sobre los stored procedures extendidos (xp_...).
Para todos los niveles, es recomendable guardar auditoria y realizar monitoreos mediante alertas (Por ej: SCOM o en su vieja version MOM).
Tenes un articulo muy bueno en ntro sitio al cual podes echar un vistazo.
http://www.todosql.com/hackers-pueden-atacar-sql-server
Un abrazo virtual !
Muchas gracias por la respuesta.. Tocara empezar a hacer las respectivas pruebas.
En el log de sql2005, me deja el siguiente texto si se borra una base de datos:
2009-10-07 11:25:13.06 spid54 SQL Server has encountered 2 occurrence(s) of cachestore flush for the 'Object Plans' cachestore (part of plan cache) due to some database maintenance or reconfigure operations.
2009-10-07 11:25:13.07 spid54 SQL Server has encountered 2 occurrence(s) of cachestore flush for the 'SQL Plans' cachestore (part of plan cache) due to some database maintenance or reconfigure operations.
2009-10-07 11:25:13.07 spid54 SQL Server has encountered 2 occurrence(s) of cachestore flush for the 'Bound Trees' cachestore (part of plan cache) due to some database maintenance or reconfigure operations.
Como puedo saber el nombre de la base de datos borrada???.
Muchas gracias, Paco
Hola Paco como estas !, bueno, seguramente utilizaste el wizard o ayudante de SQL Server para generar un plan de mantenimiento de base de datos, es por ello que cada vez que se elimina una base de datos, te queden jobs apuntando a la base borrada. Lo primero que haría es chequear la salida de todos los jobs agendados en el sql server, para ver errores y warning.
Con respecto a como saber cual es la base de datos borrada es muy sencillo:
1) Query para listar base de datos:
select dbid,dbname from sysdatabases;
2) Buscar por el errorlog de SQL server los siguientes string:
deleted database
drop database
removed database
3) Para determinar en tiempo de ejecución que aplicacion o usuario puede estar borrando una base de datos, levanta un Profiler de SQL Server y graba en una tabla o archivo para almacenar y luego realizar la búsqueda.
Abrazo virtual.
nalonso
Muchas gracias JLopez por tu ayuda. Voy a poner en marcha lo que me propones.
como puedo saber que usario elimino un registro de la DB
como puedo visualizar el log de esta
saludos
Victor C
Hola Victor como estas !, te comento, en versiones 2005 y superior lo podes encarar a través de DML TRIGGERS, para las operaciones de DELETE sobre la tabla afectada.
Para poder registrar y leer la actividad deberías crear una tabla en la misma base de datos o bien en otra tipo de auditoria, donde el trigger realice un insert a la misma, con los datos de usuario y registro.
Puedes utilizar las funciones SESSION_USER (Transact-SQL), USER_NAME,SUSER_SNAME para determinar el usuario y GETDATE() fecha y hora entre otras funciones.
Resumiendo:
TRIGGERS DML, FUNCIONES y TABLAS de auditoria.
Espero te sirva.
Abrazo Virtual.
nalonso
Compartir