Jump to content

Recommended Posts

Posted

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

FAÇO TUDO COM DUAS LINHAS DE CÓDIGO;

Posted

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

FAÇO TUDO COM DUAS LINHAS DE CÓDIGO;

Posted

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

FAÇO TUDO COM DUAS LINHAS DE CÓDIGO;

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.