【问题标题】:What Access Rights am I Missing on my Stored Procedure我的存储过程缺少哪些访问权限
【发布时间】:2009-07-16 19:54:03
【问题描述】:

我正在尝试从我的网站运行一个禁用触发器的存储过程。这是触发器的代码:

CREATE PROCEDURE [dbo].[DisableMyTrigger]
AS
BEGIN
    alter table dbo.TableName DISABLE TRIGGER TriggerName
END

我还设置了存储过程的权限:

Grant Exec on dbo.DisableMyTrigger To DBAccountName

DBAccountName 能够并且已经能够运行其他存储过程以及动态 SQL 语句而不会出现问题。

这是我的 CFM 页面中的代码:

<cfstoredproc datasource="myDatasource" procedure="DisableMyTrigger" />

这是我得到的错误:

[Macromedia][SequeLink JDBC Driver][ODBC Socket][Microsoft][SQL Native Client][SQL Server]Cannot find the object "TableName" because it does not exist or you do not have permissions.

【问题讨论】:

    标签: sql sql-server-2005 stored-procedures coldfusion


    【解决方案1】:

    DBAccountName 是否对 TableName 有权限?这些可以与整体架构 (dbo) 分开授予或撤销。

    我不是 dba,但允许 DBAccountName 执行 DDL 语句吗? (因此它可以以编程方式执行诸如禁用触发器之类的操作)

    【讨论】:

    • DBAccountName 确实有权访问表名。但是,我不确定第二部分。我认为通过授予该用户对该过程的执行权限,那么过程中的内容就无关紧要了。
    • @Jason:在 MS SQL 2000 中,三个语句:插入、更新和删除通过存储过程的所有者获得了权限,而不是连接的权限。要在存储过程中执行 DDL,调用 SP 的用户需要运行 DDL 的权限。除非用户有权截断表,否则即使 TRUNCATE TABLE 也无法运行。
    • @Jason:我添加了另一个关于权限和存储过程的问题的答案。其他 DDL 语句的错误消息与您得到的类似。见:stackoverflow.com/questions/1139137/…
    【解决方案2】:

    这是因为您连接到错误的数据库目录(假设 SQL Server)。您连接到数据库但您连接到“默认”目录,这可能是“主”

    我认为您可以在程序的开头添加一些内容,例如:

    使用 DBName;

    这会将您连接到正确的目录。

    【讨论】:

    • Msg 154,级别 15,状态 1,过程 DisableMyTrigger,第 9 行不允许在过程、函数或触发器中使用 USE 数据库语句。
    • 你在创建存储过程的基础上写了use database吗?
    • “使用数据库”将为 proc 的编译设置 db,但如果在运行时找不到对象,则无济于事。不确定这是在哪个数据库上,但我敢打赌,如果对象不在目录中,proc 甚至都不会编译。我可能错了。
    【解决方案3】:

    您可能必须指定数据库。我认为这不是权限问题,我相信它只是无法在该数据库中找到它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 2021-01-20
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 2019-08-23
      • 2011-04-02
      相关资源
      最近更新 更多