• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

freaklori

[SQL SERVER] Trigger

5 mensagens neste tópico

Boas,

Tou aqui com uma dificuldade..

Ja criei um trigger e encontra-se a funcionar a minha duvida é como posso agarrar num determinado campo que no meu caso será um campo varchar e dividir esse campo em palavras sempre que encontrar um espaço e introduzir no trigger as palavras associada a tabela mae atraves do ID...

CREATE TRIGGER Novo_Registo 
ON TMae
FOR INSERT
AS
INSERT INTO TFilho( ID,Palavra) SELECT ID,Texto FROM TMae

Este trigger faz o seguinte... semper que inserir um registo novo na TMAE ele copia o CAMPO TEXTO para a tabela TFILHO o respectivo TEXTO e ID associado a esse texto..

o que eu quero é em vez de introduzir esse texto... ele agarre no texto divida em palavras sempre que encontrar um espaço e introduza na tabela TFILHO essas palavras com o ID associado a TMAE.. ja ouvi falar em Stored Procedures... mas ainda n encontrei nada na net sobre isso..

Se alguem me puder ajudar...

(a explicaçao pode tar uma beca confusao eu posso voltar a tentar explicar melhor)

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boas,

vou ver esse site que me deste e ja posto aqui a solução

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas estou aqui novamente com ou tra duvida...

Criei o seguinte trigger:

Create TRIGGER T
ON TMae
FOR INSERT 
AS
Exec  Procedure_Dividir_Texto 

Que executa o  stored procedure -> Procedure_Dividir_Texto:

CREATE PROCEDURE Procedure_Dividir_Texto 
AS
EXTERNAL NAME
[Dividir_Texto_Palavras].[CLR].[Texto_Em_Palavras]

Que por sua vez executa o assemblie que ja criei no SQL mas que foi compilado em vb.net

Quando vou inserir um novo registo o que deveria acontecer era executado o trigger que executava a stored procedure que por sua vez executava o assemblie que terá que receber um parametro (uma frase por exemplo) que irá dividir em palavras returnando um conjunto de palavras.

o problema é que quando tento inserir um novo registo na Tabela TMAE ocorre me o seguinte erro:

Msg 6522, Level 16, State 1, Procedure Procedure_Dividir_Texto, Line 0

A .NET Framework error occurred during execution of user-defined routine or aggregate "Procedure_Dividir_Texto":

System.Security.SecurityException: Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.

System.Security.SecurityException:

   at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)

   at System.Security.PermissionSet.Demand()

   at System.Data.Common.DbConnectionOptions.DemandPermission()

   at System.Data.SqlClient.SqlConnection.PermissionDemand()

   at System.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection)

   at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)

   at System.Data.SqlClient.SqlConnection.Open()

   at CLR.Texto_Em_Palavras()

.

The statement has been terminated.

Aqui fica tambem o codigo que esta compilado no assemblie do SQL

Vou por aqui tambem o codigo vb.net que vai dividir o texto em palavras sempre que encontra um espaço

Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server


Partial Public Class CLR
  <SqlProcedure()> _
    Public Shared Sub Texto_Em_Palavras()
    Dim Palavras() As String
    Dim Texto_Dividido() As String = Nothing
    Dim Delimitador As Char = " "

    Dim Conn As New SqlConnection("Data Source=DEVELOPER\SQLEXPRESS;Initial Catalog=Testes;UID=;Password=;Trusted_Connection=true;")
    Conn.Open()
    Dim Query As String = "SELECT MAX(ID) FROM Tmae "
    Dim Cmd As New SqlCommand(Query, Conn)
    Dim ID As Integer = Cmd.ExecuteScalar()

    Dim Query2 As String = "SELECT Texto FROM TMae WHERE ID=" & ID
    Dim Cmd2 As New SqlCommand(Query2, Conn)
    Dim Texto As String = Cmd2.ExecuteScalar()

    Texto_Dividido = Texto.Split(Delimitador)

    ReDim Palavras(UBound(Texto_Dividido))

    For i As Integer = 0 To UBound(Texto_Dividido)
      Palavras(i) = Texto_Dividido(i)
      Trigger.Novo_Registo(ID, Palavras(i))
    Next
  End Sub
End Class

Public Class Trigger
  <SqlTrigger(Event:="FOR INSERT", Name:="T", Target:="Tmae")> _
   Public Shared Sub Novo_Registo(ByVal ID As Integer, ByVal Palavra As String)
    Dim Conn As New SqlConnection("Data Source=DEVELOPER\SQLEXPRESS;Initial Catalog=Testes;UID=;Password=;Trusted_Connection=true;")
    Conn.Open()

    Dim Query As String = "INSERT INTO TFilho(ID,Palavra) VALUES (" & ID & " , '" & Palavra & "')"

    Dim cmd As New SqlCommand(Query, Conn)
    cmd.ExecuteNonQuery()
  End Sub
End Class

Se alguem puder ajudar...

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas...

Ao fim de algum tempo consegui resolver a situaçao...

o objectivo era a criacçao de um trigger que estava associado ao evento INSERT na tabela TMae e que introduzia na tabela TFilho o texto dividido por palavras...

NO SQL:

Adicionar o Assemblie criado em vb.net ao Core do SQLServer

CREATE ASSEMBLY [Dividir_Texto_Palavras] FROM
'C:\Projectos2005\CLR\CLR\CLR\CLR.dll'

Criacção do trigger no sql:

CREATE TRIGGER Gera_Trigger
    ON TMae 
    FOR INSERT
    AS EXTERNAL NAME  Dividir_Texto_Palavras.CLR.Novo_Registo

A Dll foi compilada atraves da prompt do VS2005 que contem o seguinte codigo:

Partial Public Class CLR

  <SqlTrigger(Event:="FOR INSERT", Name:="Gera_Trigger", Target:="TMae")> _
  Public Shared Sub Novo_Registo()
    Using Conn As New SqlConnection("Context Connection = true;")
      Conn.Open()

      Dim Texto_Dividido() As String = Nothing
      Dim Delimitador As Char = " "

      Dim cmdID As New SqlCommand("SELECT Max(@@Identity) From Tmae", Conn)
      Dim ID As Integer = cmdID.ExecuteScalar

      Dim cmdTexto As New SqlCommand("SELECT Texto From TMae WHERE ID=" & ID, Conn)
      Dim Texto As String = cmdTexto.ExecuteScalar

      Texto_Dividido = Texto.Split(Delimitador)

      For i As Integer = 0 To UBound(Texto_Dividido)
        Dim cmd As New SqlCommand("INSERT INTO TFILHO (ID,Palavra) VALUES (" & ID & ",'" & Texto_Dividido(i) & "')", Conn)
        Dim RD As SqlDataReader = cmd.ExecuteReader()
        RD.Close()
      Next

    End Using

   End Sub

Nao sei se vai ser util para alguem mas aqui fica...

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora