Cómo utilizar las funciones de aplicación con proyectos de Access y SQL Server 2000 Desktop

Seleccione idioma Seleccione idioma
Id. de artículo: 308312 - Ver los productos a los que se aplica este artículo
Avanzado: Requiere codificación experto, interoperabilidad, conocimientos y multiusuario.

Este artículo se aplica únicamente a proyectos de Microsoft Access (.adp).

Para obtener una versión de Microsoft Access 2000 de este artículo, consulte 318816.
Expandir todo | Contraer todo

Resumen

En este artículo explica las funciones, las limitaciones y las soluciones provisionales para utilizar las funciones de aplicación de Microsoft SQL Server en un proyecto de Microsoft Access (ADP).

Más información

En SQL Server, puede crear funciones de base de datos para facilitar la administración de permisos en una base de datos. En lugar de conceder permisos individuales para cada usuario por separado, puede agrupar usuarios con las mismas necesidades permiso por haciéndolos miembros de la misma función de base de datos normal y, a continuación, asignar permisos a la propia función de base de datos. A menos que un permiso específico se deniegue explícitamente en otro lugar, los usuarios de miembro adquieren los permisos concedidos a esa función de base de datos.

Aunque funciones de base de datos normal son muy útiles en situaciones en que desea que los usuarios puedan realizar sus propias consultas ad hoc o actualizaciones a una base de datos, no son siempre apropiados. A veces, es conveniente que los usuarios sólo ciertos permisos cuando utiliza una aplicación específica y no desea poder ver o modificar los datos fuera de la aplicación.

Un método que se utiliza a menudo para solucionar esto es a sólo los permisos necesarios a una cuenta de usuario SQL Server. Los usuarios reales podrían tener permisos para conectarse a una base de datos pero no ver o modificar los datos. Volver a después de que un usuario se conecte a la base de datos utilizando la cuenta del usuario individual, el ADP podría a continuación, mediante programación conectar mediante las credenciales de la cuenta de usuario tiene permisos. Aunque esto puede ser efectiva, no permite distinguir entre usuarios en la base de datos o para determinar qué usuario realiza una acción determinada.

Las funciones de aplicación están diseñadas para evitar esta limitación. Funciones de aplicación, a diferencia de las funciones de base de datos normal, no tienen miembros propios. En su lugar, los usuarios iniciar sesión en un servidor SQL Server y conectarse a una base de datos mediante sus propias credenciales. En ese momento, el contexto de seguridad de una función de aplicación se puede aplicar mediante programación a una conexión existente mediante el procedimiento almacenado sp_setapprole . En SQL Server, todavía se diferencian los usuarios individuales pero los permisos que están disponibles dentro de una conexión determinada están limitadas a permisos de la función de aplicación. Del usuario individual permisos, ya sea menor o mayor, ya no se consideran.

Crear una función de aplicación

Microsoft Access proyectos no tienen las herramientas de diseño visual para crear objetos de seguridad de SQL Server, como las funciones de aplicación. Microsoft recomienda que utilice las herramientas de cliente incluidas con la versión normal de SQL Server o Microsoft Office XP Developer para crear la función de aplicación y asignarle permisos. Sin embargo, todavía puede crear la función de aplicación y otorgarle los permisos necesarios mediante programación utilizando Transact-SQL (T-SQL) desde un ADP. Aunque una explicación completa de seguridad de SQL Server fuera del ámbito de este artículo, adicional puede encontrar información en Los libros en pantalla de SQL Server los pasos siguientes muestran cómo crear una función de aplicación mediante programación y conceder permisos SELECT en una tabla de la nueva función:
  1. Inicie Access.
  2. Abra el proyecto de Access de ejemplo Northwind.
  3. En la ventana base de datos, haga clic en módulos en objetos y, a continuación, haga clic en nuevo para abrir un nuevo módulo en el entorno de Visual Basic.

    Nota En Access 2007, haga clic en módulo en el grupo otros en la ficha crear .
  4. Escriba o pegue el código siguiente en el nuevo módulo:
    Public Function AddNewAppRole(RoleName As String, PW As String) As Boolean
    On Error GoTo EH:
    If CurrentProject.IsConnected Then
    Dim sTSQL As String
        'Create the command
    sTSQL = "EXEC sp_addapprole '" & RoleName & "','" & PW & "'"
        'Send the command
    Application.CurrentProject.Connection.Execute sTSQL
    AddNewAppRole = True
    Else
    AddNewAppRole = False
    End If
    Exit Function
    EH:
    MsgBox Err.Number & ": " & Err.Description, vbCritical
    AddNewAppRole = False
    End Function
    					
  5. Guarde el módulo y, a continuación, salga el entorno Visual Basic.
  6. Crear una copia de la tabla Customers y, a continuación, guárdelo como tNewTable . Para ello, siga estos pasos:
    1. En la ventana base de datos, haga clic con el botón secundario en la tabla Customers y, a continuación, haga clic en Guardar como en el menú contextual.

      Nota En Access 2007, haga clic en la tabla clientes en el panel de exploración, haga clic en el Botón de Microsoft Office , elija Guardar como y, a continuación, haga clic en Guardar objeto como .
    2. En el cuadro de diálogo escriba tNewTable en el cuadro Guardar tabla 'Clientes' para y, a continuación, haga clic en Aceptar .
  7. En la ventana base de datos, haga clic en formularios bajo objetos , haga clic en nuevo y, a continuación, haga clic en Aceptar para abrir un nuevo formulario en la vista Diseño.

    Nota En Access 2007, haga clic en Diseño del formulario en el grupo formularios en la ficha crear .
  8. Agregue un botón de comando al formulario de nuevo.
  9. Establezca la propiedad OnClick del botón de comando nuevo en el siguiente procedimiento de evento:
    On Error GoTo EH:
    'Code only works if ADP is connected.
    If CurrentProject.IsConnected Then
        Dim bNewAppRole As Boolean, strTSQL As String
        Dim strRoleName As String, strPW As String
        strRoleName = "AppRoleName"
        strPW = "Password"
        'Call function to create app role.
        bNewAppRole = AddNewAppRole(strRoleName, strPW)
        'Test to see if it failed.
        If bNewAppRole = False Then
            Exit Sub
        End If
        MsgBox "New Application role '" & strRoleName & "' created", vbInformation
        'Create command to grant permissions.
        strTSQL = "Grant Select on tNewTable to " & strRoleName
        'Send the command.
        Application.CurrentProject.Connection.Execute strTSQL
        MsgBox "Select permissions granted on tNewTable for " & strRoleName
    Else
    MsgBox "ADP must be connected to SQL Server"
    End If
    Exit Sub
    EH:
    MsgBox Err.Number & ": " & Err.Description, vbCritical
    					
  10. Cierre el entorno de Visual Basic para volver al formulario.
  11. Guarde el formulario y, a continuación, cambie el formulario a la vista formulario .
  12. Haga clic en el botón de comando para ejecutar el código subyacente.

    Observe que recibe dos cuadros de mensaje para indicar el éxito. Recibe uno después de la función de aplicación se crea y se conceden al segundo después de los permisos de función nueva a tNewTable.

Implementar la función de aplicación

La complicación principal cuando se utiliza las funciones de aplicación en proyectos de Access es que Access utiliza tres conexiones a SQL Server para controlar diversas tareas. Idealmente, para aplicar una función de aplicación a todo el proyecto, tendría que ejecutar sp_setapprole en el contexto de todas las tres conexiones. Los objetos controlados por cada conexión son:

  1. Utiliza para determinar qué objetos aparecen en la base de datos de ventana y para tareas administrativas de base de datos varios.

    Se utiliza para abrir las tablas, vistas, procedimientos almacenados, funciones y los orígenes de registro para los formularios y los subinformes (pero no para el informe principal).

    Usado para obtener los orígenes de registro para cuadros combinados, cuadros de lista y los informes.
  2. Se utiliza para abrir las tablas, vistas, procedimientos almacenados, funciones y los orígenes de registro para los formularios y los subinformes (pero no para el informe principal).

    Usado para obtener los orígenes de registro para cuadros combinados, cuadros de lista y los informes.
  3. Usado para obtener los orígenes de registro para cuadros combinados, cuadros de lista y los informes.

Aunque las conexiones # 2 y 3 pueden tener acceso fácilmente, no hay ningún método disponible para ejecutar el procedimiento almacenado en el contexto de conexión # 1. Afortunadamente, esta conexión es la menos importante de los tres y fácilmente solucionada creando su propia interfaz de usuario (por ejemplo, un formulario de tipo de panel de control) para controlar objetos de base de datos en lugar de confiar en la ventana base de datos integrada.

Los pasos siguientes utilizan el proyecto de ejemplo Neptuno de Access para demostrar cómo aplicar una función de aplicación con conexiones # 2 y 3:

  1. En la ventana base de datos, haga clic en formularios bajo objetos , haga clic en nuevo y, a continuación, haga clic en Aceptar para abrir un nuevo formulario en la vista Diseño.

    Nota En Access 2007, haga clic en Diseño del formulario en el grupo formularios en la ficha crear .
  2. Agregue un cuadro de lista en el formulario recién creado y, a continuación, establezca la propiedad Name del cuadro de lista a lst_AppRole .
  3. Agregue un botón de comando al formulario.
  4. Establezca la propiedad OnClick del botón de comando nuevo en el siguiente procedimiento de evento:
    On Error GoTo EH
        'This avoids a message that no records were returned.
    DoCmd.SetWarnings False
    Dim TSQL
    TSQL = "EXEC sp_setapprole 'AppRoleName', {Encrypt N 'Password'}, 'odbc'"
        'This sets the app role on Connection #2.
    Application.CurrentProject.Connection.Execute TSQL
        'This sets the app role on Connection #3.
    lst_approle.RowSource = TSQL
    lst_approle.Requery
    DoCmd.SetWarnings True
    MsgBox "The application Role is now in effect.", vbInformation
    Exit Sub
    EH:
    MsgBox Err.Number & ": " & Err.Description, vbCritical
    					
  5. Cierre el entorno de Visual Basic para volver al formulario.
  6. Guarde el formulario y, a continuación, cambie el formulario a la vista formulario .
  7. Haga clic en el botón de comando para ejecutar el código subyacente.

    Observe que recibe un cuadro de mensaje que indica éxito.
  8. En la ventana base de datos, haga clic en tablas bajo objetos y, a continuación, abra la tabla tNewTable .

    Nota En Access 2007, haga doble clic en el panel de exploración de tabla de tNewTable .
  9. Modificar un registro e intenta guardar los cambios.
Observe que, como intentar confirmar los cambios, recibirá un mensaje de error sobre no tiene suficientes permisos. Esto ocurre porque le asignó la nueva función de aplicación permiso SELECT en la tabla tNewTable , pero no el permiso de actualización .

Por diseño, Access sólo muestra objetos en la ventana base de datos para el que el usuario seleccione al menos o permisos de ejecución. Access utiliza conexión # 1 para determinar qué objetos de un usuario tiene permisos para. Después de aplicar la aplicación función a la ventana Conexiones # 2 y 3, la base de datos todavía muestra los objetos mismos que tenía antes, aunque el usuario ya no tenga permisos a todos los objetos, o puede tener permisos a objetos más que no se muestran. Esto puede producir un comportamiento inesperado cuando utilice la ventana de base de datos.

Por ejemplo, cuando abre la tabla tNewTable, "aparece" que el usuario tenga permisos Editar e insertar registros. El icono de registro nuevo de inserción en la parte inferior de la tabla está habilitado, y el usuario puede poner un registro en modo de edición. No verá ninguna pista visual para indicar en caso contrario, hasta que intenta confirmar la edición o inserción, que da un mensaje de error. Acceso cree que tendrá permisos cuando realmente no lo hace.

La solución más eficaz consiste en proporcionar una interfaz personalizada para el usuario y no dependen de la ventana base de datos. Mediante una interfaz de usuario de tipo de panel de control, puede controlar exactamente qué objetos que el usuario tiene acceso a.

Otras limitaciones y consideraciones de seguridad

los subformularios no funciona

A diferencia con otros objetos de base de datos, Access no siempre usa la misma conexión para recuperar el origen de datos de un subformulario. Acceso con frecuencia (pero no siempre) crea una nueva conexión a SQL Server sólo para controlar el conjunto de registros del subformulario, o para recuperar los datos de campo de vinculación que se conecta el subformulario al formulario principal. Porque esta nueva conexión no tiene asignada la función de aplicación, se puede generar un error de permisos si no tienen permisos explícitos al objeto de base de datos. Lamentablemente, esto significa que no hay ninguna forma confiable de utilice subformularios enlazados cuando se aplican las funciones de aplicación. La solución sólo eficaz es completamente ha independiente subformularios, con la manipulación de datos, controlada mediante programación. Ésta es la limitación más grave al utilizar las funciones de aplicación en Access.

informes no funciona

Cuando tiene un objeto como una tabla o un nombre de vista se muestra como origen de registros de un informe o subinforme, Access comprueba si el objeto aparece en la ventana base de datos antes de recuperar los datos de SQL Server. Debido a la ventana base de datos utiliza una conexión que no tiene asignada la función de aplicación, se genera un error si no tiene permisos explícitos en el origen de datos subyacente.

Para evitar este problema, utilice siempre las instrucciones Transact-SQL como origen de registros para formularios e informes. Por ejemplo, utilice "Seleccionar * de ViewName" en lugar de simplemente "ViewName" o "Exec StoredProcedureName" en lugar de simplemente "StoredProcedureName". De este modo, Access pasa las instrucciones de Transact-SQL directamente a SQL Server y recupera los datos según los permisos de la función de aplicación.

función de la base de datos pública

Una función de aplicación adquiere los permisos de la función Public de base de datos. De forma predeterminada en NeptunoCS, la función public tiene permisos completos a la mayoría de los objetos. Por tanto, una función de aplicación es generalmente ineficaz. Al crear la tabla tNewTable en la sección "Crear una función de aplicación", la función public no se concedió permiso para la tabla y más adelante vio los efectos del contexto de seguridad de la función de aplicación en esa tabla. Sin embargo, otras tablas no pueden mostrar cualquier diferencia en la función de aplicación porque la función public tiene permisos a esos objetos.

seguridad VBA

Dado que la contraseña de la función de aplicación está incrustada en la aplicación que se llama, un usuario experto no podrán leer el nombre de función de aplicación y la contraseña el código fuente y, a continuación, utilizar esa información para tener acceso a SQL Server desde otra aplicación. Por lo tanto, es una buena idea para compilar el ADP en un archivo ADE, por lo que el código fuente no es visible. Como mínimo, exija una contraseña en el proyecto de VBA.

Referencias

Para obtener información adicional acerca de una versión de Microsoft Access 2000 de este artículo, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
318816ACC2000: Cómo usar funciones de aplicación con proyectos de Access y SQL Server 2000 Desktop Engine (MSDE 2000)
Para obtener más información acerca de GRANT, consulte los Libros en pantalla de SQL Server . Los Libros en pantalla de SQL Server está disponible en el siguiente sitio Web de Microsoft:
http://www.Microsoft.com/sql/techinfo/productdoc/2000/default.ASP

Propiedades

Id. de artículo: 308312 - Última revisión: jueves, 29 de marzo de 2007 - Versión: 6.2
La información de este artículo se refiere a:
  • Microsoft Office Access 2007
  • Microsoft Office Access 2003
  • Microsoft Access 2002 Standard Edition
Palabras clave: 
kbmt kbexpertiseinter kbinfo kbprogramming kbadp kbvba kbhowto KB308312 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 308312

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com