Hej alla! När jag läste detta lite snabbt så försöker du göra något som inte är tillåtet. Du försöker ta bort en användare och all information rörande denna användare men datat är kopplat till företag och inte användare. Det låter därmed helt fel att försöka ens tillåta en sådan radering. Jo informationen är kopplat till företaget eftersom jag har flera användartyper. En av typerna är just företag. Hej! Du har fullständigt rätt!Lost in SP!
Jag sitter med ett litet problem som jag hoppas att ni kan hjälpa mig med.
Jag har tre tabeller:
Recipients (mottagare)
*RecipientID
CompanyID (fk)
RecipientName
OSv...
RecipientGroups (mottagargrupp)
*RecipientGroupID
CompanyID (fk)
RecipientGroupName
Osv...
Recipients_RecipientGroups (kopplingstabell)
RecipientID
RecipientGroupID
Dessutom har jag en Userstabell och en Companytabell. En User kan ha Ett Company.
Nu håller jag på med en delete stored procedure som heter removeUserByID, jag skickar med userID som parameter.
Mellan User och Companytabellen har jag Cascade Delete Related Records men det kan jag inte ha mellan Recipients och Recipients_RecipientGroups och mellan RecipientGroups och Recipients_RecipientGroups.
Anledning till det är att jag får cycle om jag gör så.
Så det jag vill göra nu är att när jag tar bort en användare så ska stored procedure'n först ta bort alla kopplingar mellan Recipients och RecipientGroups och därefter alla Recipients och RecipientGroups.
Men hur ska jag gå tillväga med att göra detta?
Som sagt så skickar jag med UserID som parameter till proceduren och det första jag gör är att deklarera en variabel som hämtar CompanyID från Companies-tabellen.
Jag måste ju ha den eftersom det är CompanyID som är fk i de andra tabellerna.
Men hur ska jag göra härnäst?Sv: Lost in SP!
Men om RecieptID är samma sak som användarens id då är det en annan femma för då har du ju i alla fall identifierade poster kopplade till en användare och inte till företag. Men som sagt, jag läste lite snabbt så förklara dig gärna ytterligare.
En vanlig rutin för en sp är i stil med
<info>
create proc...
@userid int
as
set nocount on
begin tran
delete from underundertabell where ....
delete from undertabell where ....
delete from tabell where ....
if (@@error <> 0)
rollback tran
commit tran
</info>Sv: Lost in SP!
Jag har börjat lite här:
<code>CREATE PROCEDURE removeUserByID
@UserID int
AS
DECLARE @CompanyID AS Integer
SET @CompanyID = 0
SET @CompanyID = (SELECT CompanyID FROM Companies WHERE UserID = @UserID)
IF @CompanyID > 0
BEGIN
BEGIN
DELETE Recipients
WHERE CompanyID = @CompanyID
END
BEGIN
DELETE RecipientGroups
WHERE CompanyID = @CompanyID
END
BEGIN
DECLARE @ScheduleID AS Integer
DECLARE @SchedulesCount AS Integer
DECLARE @i AS Integer
SET @ScheduleID = 0
SET @SchedulesCount = 0
SET @i = 0
SET @SchedulesCount = (SELECT Count(ScheduleID) FROM Schedules WHERE CompanyID = @CompanyID)
--WHILE @i <= @SchedulesCount
--BEGIN
--END
END
BEGIN
DELETE Companies
WHERE UserID = @UserID
END
END
DELETE Users
WHERE
UserID = @UserID
GO</code>
Oj, ser att det är lite annat i sp'n jag håller på med.
Jag har alltså schemaläggning med i matchen.. det är den jag håller på med just nu.
Jag måste ju kolla igenom hur många schemaläggningar ett visst företag ha och sen ta bort alla Schedules_Recipients och Schedules_RecipientGroups för ett visst ScheduleID.
Suck.. har börjat på en while-sats som du ser men jag vet inte hur jag ska gå tillväga faktiskt.
Jag har tagit bort alla relationer nu, jag fick en massa fel när jag la in ett nytt företag och blabla :(Sv: Lost in SP!
Du jobbar i SQL nu, och där är loopar av ondo :)
Du behöver inte loopa igenom dina schedules överhuvudtaget.
BEGIN och END gör ingen som helst nytta i sig själva. De behöver du bara använda om:
-du har en kontrolfunktion såsom IF eller WHILE innan
OCH
-BEGIN och END innesluter mer än ett statement
Kika här för ett förslag på hur du kan göra istället. Är inte hundra procent säker på din databasmodell, så du får ändra själv så att det blir rätt!
<code>
CREATE PROCEDURE removeUserByID
@UserID int
AS
DECLARE @CompanyID AS Integer
SET @CompanyID = 0
SET @CompanyID = (SELECT CompanyID FROM Companies WHERE UserID = @UserID)
IF @CompanyID > 0
BEGIN
DELETE Recipients
WHERE CompanyID = @CompanyID
DELETE RecipientGroups
WHERE CompanyID = @CompanyID
DELETE Schedules_Recipients
FROM schedules
WHERE Schedules_Recipients.ScheduleID=schedules.ScheduleID
AND schedules.CompanyID = @CompanyID
DELETE Schedules_RecipientGroups
FROM schedules
WHERE Schedules_RecipientGroups.ScheduleID=schedules.ScheduleID
AND schedules.CompanyID = @CompanyID
DELETE schedules
WHERE CompanyID = @CompanyID
DELETE Companies
WHERE UserID = @UserID
END
DELETE Users
WHERE
UserID = @UserID
GO
</code>Sv: Lost in SP!
Tack så mycket och tack också till förklaringen av Begin och End :)