繁体   English   中英

对从SQL Server 2005中的表中删除任何行做出反应的方法

[英]Way to react on deleting any row from table in sql server 2005

在我们的数据库中,我们有很多表(当然)。 在我们的数据库中有一个表说文件。 该表包含与每个表相关的所有文件的列表,如人物,联系人等。现在文件表中有一列(父记录)存储父记录键(而不是数据库级的外键),因为不可能列与多个表有关系),无论是人员还是联系人。 现在,我想在一个地方的数据库级别创建一些东西,以查看我们已从人员中删除行,因此从联系人中删除所有行。

  1. 在每个表上创建触发器的一种方法,但是我们有数百个表。
  2. 我们不能使用级联删除,因为关系不是外键。

获取现有数据后,我们将无法更改表的结构。

谢谢

“ pst”建议的方法本质上是垃圾回收方法,可能比使用触发器更受青睐。 如果不了解系统的整体特征,那么如果响应能力更为重要,则此方法将不会在删除给定记录上增加任何时间。 换句话说,拥有未引用资源的风险小于减慢删除步骤的风险。

此示例代码将遍历具有标识的表,并删除集中式“资源”表中该表的所有孤立项。

假设:

  • 每个父表都有一个标识列
  • 资源表“文件”以某种方式标识了可以找到其父表的表(此示例将“ TableName”列硬编码为示例)

(发布在Microsft脚本中心上) http://gallery.technet.microsoft.com/scriptcenter/Garbage-Collection-of-a-99594c13

DECLARE @ResourceTableName sysname
SET @ResourceTableName = 'Resource'

--cursor variables
DECLARE @sql nvarchar(max)

DECLARE @primarySchema sysname
DECLARE @primaryTableName sysname
DECLARE @identityColumnName sysname

DECLARE curTableName CURSOR LOCAL FAST_FORWARD READ_ONLY FOR 
SELECT table_schema, table_name, column_name
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1 
AND table_name <> @ResourceTableName

-- loop through tables
OPEN curTableName

FETCH NEXT FROM curTableName
INTO @primarySchema, @primaryTableName, @identityColumnName
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @sql = '
        DELETE --SELECT *
        FROM ' + @ResourceTableName + '
        WHERE TableName = ''' + @primaryTableName + '''
        AND ParentID NOT IN (
            SELECT ' + @identityColumnName + ' FROM  ' +  @primarySchema + '.' + @primaryTableName + '
        )'

    --PRINT @sql
    EXEC sp_ExecuteSQL @sql

    FETCH NEXT FROM curTableName
    INTO @primarySchema, @primaryTableName, @identityColumnName
END

-- close a cursor
CLOSE curTableName
DEALLOCATE curTableName

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM