Sql server 2005 在SQLServer2005中从表中删除任何行时的反应方式
在我们的数据库中,当然有很多表。我们的数据库中有一个表,比如说文件。此表包含与每个表相关的所有文件(如人员、联系人等)的列表。现在文件表中有一列父记录,在数据库级别存储父记录键而不是外键,因为同一列不可能与多个表中的人员或联系人相关。现在我想在一个地方创建一些数据库级别的东西,我们已经从联系人中删除了行,所以删除联系人中的所有行 在每个表上创建触发器的一种方法,但我们有数百个表。 我们不能使用级联删除,因为关系不是外键。 我们无法更改表的结构,因为我们获得了现有数据Sql server 2005 在SQLServer2005中从表中删除任何行时的反应方式,sql-server-2005,Sql Server 2005,在我们的数据库中,当然有很多表。我们的数据库中有一个表,比如说文件。此表包含与每个表相关的所有文件(如人员、联系人等)的列表。现在文件表中有一列父记录,在数据库级别存储父记录键而不是外键,因为同一列不可能与多个表中的人员或联系人相关。现在我想在一个地方创建一些数据库级别的东西,我们已经从联系人中删除了行,所以删除联系人中的所有行 在每个表上创建触发器的一种方法,但我们有数百个表。 我们不能使用级联删除,因为关系不是外键。 我们无法更改表的结构,因为我们获得了现有数据 谢谢,pst建议的方法本质上
谢谢,pst建议的方法本质上是一种垃圾收集方法,可能比触发器的使用更受欢迎。由于不知道系统的总体特征,如果响应性更重要,这种方法不会增加删除给定记录的时间。换句话说,拥有未引用资源的风险小于减慢删除步骤的风险 此示例代码将循环遍历具有标识的表,并删除集中式“资源”表中该表的任何孤立项 假设: 每个父表都有一个标识列 资源表“files”以某种方式标识了可以找到其父表的表。例如,此示例具有硬编码的“TableName”列 发布在Microsoft脚本中心
无关系=:我知道的唯一其他数据库级选项是。。触发器。如果触发代码的大部分是相同的,例如,唯一改变的是表,它可以自动生成。另一个选项是运行清理作业,该作业将定期运行并执行某些维护任务,例如删除孤立记录。
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