none
Dúvida - Criação de Trigger pegar nome do usuário RRS feed

  • Pergunta

  •  

    Bom dia a todos!

     

    Amigos, estou criando uma trigger que seria no caso uma trigger para alimentar uma tabela de LOG do meu sistema ERP.

     

    A idéia é a seguinte:

     

    - Quando o usuário inserir o os dados na tabela ITEM_CONTRATO essa trigger deve disparar e alimentar a tabela de usuário chamada de USERTabelaLog com os campos Código, Data Atual, Usuário.

     

    Bom, até ai está tudo tranquilo, o único problema que estou enfrentando é que o nome do usuário quando insere uma informação é o unico campo que não consigo pegar para preencher. Surgiu a dúvida se talvez no momento que está inserindo uma informação de insert o nome do usuario fique registrado em alguma tabela de sistemas que eu possa pegar e jogar no insert da minha trigger.

     

    Segue os códigos:

     

    Code Snippet

    create table USERTabelaLog(
         Codigo int IDENTITY,
         Data datetime,

         Usuario varchar(30),

     

         primary key (Codigo)
    )

     

    create trigger USERTrigerItemContrato
    on ITEM_CONTRATO
    for insert
    as
    declare
    @data datetime

    set @data = GETDATE()

    insert into USERTabelaLog values (@data,@Usuario)
    GO

     

     

    Com a trigger acima eu consigo inserir o registro IDENTITY e a data atual, porém o usuario nao sei da onde pegar isso... será que alguma sp_algumacoisadesistema eu conseguiria pegar o nome do user???

     

    Abraço a todos!

     

    Desde já agradeço

     

    Clayton Santos

    quarta-feira, 30 de julho de 2008 11:37

Respostas

  • Clayton,

     

    Você poderia utilizar as funções:

     

    • Current_User --> equivalente a User_Name();
    • User_Name() --> retorna o nome do usuário conectado ao banco de dados, de acordo com id especificado;
    • Session_User --> retorna o nome do usuário de acordo com o contexto de banco de dados;
    • Suser_Name() --> retorna o nome do usuário;
    • Suser_ID() --> retorna o identificador do login associado ao nome do usuário;
    • Suser_SID() --> retorna o SID associado ao nome do login;
    • Suser_SName() --> retorna o nome do login associado ao SID;
    • System_User --> retorna o nome do login no banco de dados corrrente, de acordo com as informações na system tables sys.sysusers dentro do atual conectado.User --> retorna o nome do usuário no banco de dados corrrente, de acordo com as informações na system tables sys.sysusers dentro do atual conectado.

     

    Você pode utilizar também a table sys.sysusers, para obter informaçõe dos usuários.

     

    Veja qual destas pode te ajudar melhor, na utilização do trigger.

    quarta-feira, 30 de julho de 2008 12:09

Todas as Respostas

  • Clayton,

     

    Você poderia utilizar as funções:

     

    • Current_User --> equivalente a User_Name();
    • User_Name() --> retorna o nome do usuário conectado ao banco de dados, de acordo com id especificado;
    • Session_User --> retorna o nome do usuário de acordo com o contexto de banco de dados;
    • Suser_Name() --> retorna o nome do usuário;
    • Suser_ID() --> retorna o identificador do login associado ao nome do usuário;
    • Suser_SID() --> retorna o SID associado ao nome do login;
    • Suser_SName() --> retorna o nome do login associado ao SID;
    • System_User --> retorna o nome do login no banco de dados corrrente, de acordo com as informações na system tables sys.sysusers dentro do atual conectado.User --> retorna o nome do usuário no banco de dados corrrente, de acordo com as informações na system tables sys.sysusers dentro do atual conectado.

     

    Você pode utilizar também a table sys.sysusers, para obter informaçõe dos usuários.

     

    Veja qual destas pode te ajudar melhor, na utilização do trigger.

    quarta-feira, 30 de julho de 2008 12:09
  • Clayton,

     

    Obrigado pelo retorno.

    quarta-feira, 30 de julho de 2008 12:33
  • Galvão você é o melhor!!!

     

    Deu certinho o que preciso!!! O melhor que se encaixou pra mim foi os ultimos dois que me passou.

     

    Code Snippet
    select Suser_SName()
    select System_User

     

     

    Ele pegou o ID do Windows e como todos os usuários aqui da empresa logam dentro do dominio e nenhum através do login do SQL Server então se encaixou perfeitamente no que preciso.

     

    A solução pro meu caso ficou assim:

    Code Snippet

    create table USERLogSysItemContrato(
         Codigo int IDENTITY,
         Data datetime,
         Usuario varchar(30),

     

         primary key (Codigo)
    )

     

    --Ao inserir um item na tabela ITEM_CONTRATO a trigger insere as informações do código sequencial, a data atual e o usuario atual. Objetivo utilizar para controle de informações inseridas na tabela por usuario. Tabela de LOG.

     

    create trigger USERTrigerItemContrato
    on ITEM_CONTRATO
    for insert
    as


    declare
    @data datetime
    declare @Usuario varchar(30)

     

    set @data = GETDATE() --Data/Hora atual
    set @Usuario = (select System_User) --Usuario atual

     

    insert into USERLogSysItemContrato values (@data,@Usuario)
    GO

     

     

     

    Resultado:

    Code Snippet

     

    Codigo     Data                    Usuario                       
    ---------- ----------------------- --------------

    1          2008-07-30 09:11:17.610 PLANUS\csantos
    2          2008-07-30 09:13:27.557 PLANUS\csantos
    3          2008-07-30 09:19:48.423 PLANUS\csantos

     

    (3 row(s) affected)

     

     

    Obrigado!!!

     

    Clayton Santos

    quarta-feira, 30 de julho de 2008 12:35
  • Clayton,

     

    Agradeço o elegio, estou todos os dias aqui no fórum para ajudar e aprender também.

     

    Valeu...

    quarta-feira, 30 de julho de 2008 13:00
  • Boa tarde a todos.
    Aproveitando a duvida do nosso amigo, gostaria de saber como pegar os dados que fiz update no banco e jogar em outra tabela.

    eh bem parecido com a duvida deste topico, a diferença é que eu queria pegar todos os dados desta "linha" e replicar em outra tabela. Alguem tem um exemplo de como isso funcionaria?

    ai embaixo esta meu codigo, mas nao funcionou.

    CREATE TRIGGER replicante  ON dbo.JobInformation
     for update
    AS 
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    INSERT INTO BilhetagemIddeia.dbo.JobInformation(
    Date,   
    UserJob,   
    DocumentName,   
    Path,   
    JobId,   
    JobPrinterDriverName,   
    JobPrinterObjectName,   
    JobPrinterPortName,   
    JobPrinterShareName,   
    JobSizeInBytes,   
    JobColor,   
    JobTotalPages,   
    JobNumCopies,   
    JobDuplex,   
    JobOrientation,   
    JobPrintQuality,   
    JobPaperSizeName,   
    Status,
    DeletedTime,
    NumPages,
    NumPaper,
    PrintedTime,
    PrinterModel,
    PrinterSerialNumber,
    PrinterAddress)   
    values   
    ( 
    Declare @Date,    
    select UserJob from inserted,   
    select DocumentName from inserted,  
    select Path from inserted,   
    select JobId from inserted,   
    select JobPrinterDriverName from inserted,   
    select JobPrinterObjectName from inserted,   
    select JobPrinterPortName from inserted,   
    select JobPrinterShareName from inserted,   
    select JobSizeInBytes from inserted,   
    select JobColor from inserted,   
    select JobTotalPages from inserted   
    select JobNumCopies from inserted,
    select JobDuplex from inserted,
    select JobOrientation from inserted,
    select JobPrintQuality from inserted,
    select JobPaperSizeName from inserted,
    select Status from inserted,
    select DeletedTime from inserted,
    select NumPages from inserted,
    select NumPaper from inserted,
    select PrintedTime from inserted,
    select PrinterModel from inserted,
    select PrinterSerialNumber from inserted,
    select PrinterAddress from inserted) 
    
    END
    GO
    Obrigado a todos
    segunda-feira, 7 de dezembro de 2009 16:51