0

我有一个带有用户定义函数列文件夹的表 dnn_Files:

CREATE TABLE [dnn_Files](
    ...
    [Folder]  AS ([GetFileFolderFunc]([FolderID])),
    ...
...

该数据库是通过 dotnetnuke 安装创建并使用的。所以,它不是空的。

我真正的目标是将“dnn_”对象限定符添加到数据库中(原始数据库有空限定符)。

为了存档,我重命名了所有 dnn 表,删除了存储过程,用户定义的函数(GetFileFolderFunc 除外 - 它不能被删除,因为它被 dnn_Files 引用),查看并使用正确的对象限定符重新创建它。

之后,我得到了如上所述的表格。该表具有正确的限定符,而 GetFileFolderFunc 没有。由于表已重命名,GetFileFolderFunc 现在指的是不存在的表。具有限定符(dnn_GetFileFolderFunc)的正确双胞胎在数据库中。

所以,我希望 dnn_Files 使用新的 dnn_GetFileFolderFunc 函数。

当我尝试更改文件夹列(通过 Sql Management Studio 设计器更改计算列规范)时,它失败并显示错误“不允许保存更改。您所做的更改需要 dnn_Files 是 dropper 并重新创建...”。由于 dnn_Files 有很多关系,它不能被删除。似乎合乎逻辑。

然后我尝试更改 GetFileFolderFunc 的主体以使用具有新对象限定符的表,但也没有运气。错误是“无法更改 'dbo.GetFileFolderFunc',因为它被对象 'dnn_Files' 引用”。

第一个或第二个限制是否有任何解决方法?

Sql 服务器版本:11.0.2100.60

4

3 回答 3

3
ALTER TABLE dbo.dnn_Files  DROP COLUMN Folder;
GO
ALTER TABLE dbo.dnn_Files ADD Folder AS ([dbo].[dnn_GetFileFolderFunc]([FolderID]));

欢迎您@mt_serg。如果你想给我信用,请接受这个答案。我只是有点忙于其他一些事情,无法写出一个好的、完整的答案。

于 2013-10-02T14:18:29.100 回答
1

L_7337 是对的,只是使用 SSMS UI 的问题。

sql修改:

ALTER TABLE dbo.dnn_Files  DROP COLUMN Folder;
GO
ALTER TABLE dbo.dnn_Files ADD Folder AS ([dbo].[dnn_GetFileFolderFunc]([FolderID]));

工作正常。非常感谢!

在我看到评论之前,我以另一种方式解决了这个问题。所以,我决定回答我自己的问题,因为它可能对某人有用。

我通过 bacpac 做到了这一点。解压后(bacpac 只是一个 zip)我修改了 model.xml。相关部分在这里:

<Element Type="SqlComputedColumn" Name="[dbo].[dnn_Files].[Folder]">
  <Property Name="ExpressionScript">
    <Value><![CDATA[([dbo].[dnn_GetFileFolderFunc]([FolderID]))]]></Value>
  </Property>
  <Relationship Name="ExpressionDependencies">
    <Entry>
      <References Name="[dbo].[dnn_GetFileFolderFunc]" />
    </Entry>
    <Entry>
      <References Name="[dbo].[dnn_Files].[FolderID]" />
    </Entry>
  </Relationship>
</Element>

然后压缩并使用DacChkSum.exe计算校验和。

>dacchksum /InputFilename:database.bacpac
Model checksum
Stored:   :[5745242756E4D7CAD12C913058A1078BC1A5FA5A069C7CC0CF417719F2A64196]
Calculated:[A2B39E19E2219E05B3B4F8DC95A1B764B7A91ABBA9C70D18EAA4247B76120BB0]

在 Origin.xml 中更改校验和后,我刚刚恢复了数据库。

好像向麻雀开炮。但是有一个好处,该列保持其顺序,而更改后它成为最新的。我不希望改变大小写有任何副作用,但是在 bacpac 技巧数据库看起来更加一致之后。

于 2013-10-02T13:41:57.297 回答
0
  1. 将“dbo.GetFileFolderFunc”脚本创建为新选项卡。更改函数名称并运行脚本。
  2. 更改 dnn_files 表以引用新函数。
  3. 改变原来的功能。
  4. 更改 dnn_files 表以引用现在已更改的原始函数。
  5. 删除不再被任何东西引用的新函数。
于 2013-10-02T12:41:36.433 回答